EF Core 存储/计算属性查询数据库

问题描述 投票:0回答:1

我正在尝试将我的 C# 项目从带有 EF 的 ASP.NET 迁移到 ASP.NET Core MVC 和 EF Core。我是自学成才,并且是唯一从事该项目的人,因此我一直致力于的项目架构和标准可能会略有偏差。

我的模型通常看起来像这样:

public class Quotation
{
    public int ID { get; set; }

    public int QuotationReference { get; set; }

    [Display(Name = "Version")]
    public int VersionNo { get; set; }

    public string VersionDisplay
    {
        get
        {
            if (_context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Count() > 0)
            {
                return VersionNo.ToString() + "/" + _context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Select(s => s.VersionNo).First();
            }
            return "";
        }
    }
}

自从迁移到 EF Core 后,当尝试运行时,

_context
为空。如何在我的模型中拥有查询数据库的计算字段?

如果我不应该在模型中计算属性,那么我应该在架构中的哪里进行这些计算?

当我查询数据库然后将结果加载到视图模型中时,我的大多数控制器看起来都类似于下面的内容。

public ActionResult Create()
{
    EmployeeHolidaysController EHC = new EmployeeHolidaysController(_context,_userManager,_hostingEnvironment);
    EHC.EmployeeHolidayMaintance();

    EmployeeViewModel vm = new EmployeeViewModel();
    vm.User = _context.Users.Find(_userManager.GetUserId(User));
    vm.Employee = new Employee();
    vm.ProductionDepartments = new SelectList(_context.Departments, "ID", "DepartmentName", vm.Employee.ProductionDepartmentID);
    vm.Employee.DateOfBirth = DateTime.Now.AddYears(-20);
    vm.Employee.EmployementStartDate = DateTime.Now;

    return View(vm);
}

我应该把这些计算属性放在哪里?理想情况下,我希望它们在运行时进行计算,因为自保存单个记录以来可能添加了其他数据。

c# entity-framework-core asp.net-core-mvc code-first
1个回答
0
投票

为了拥有一个计算字段,例如上例中的属性 getter,您可以使用依赖注入将实例化的 _context 实例传递给 Quotation 类,以便该类的方法可以使用它。

这通常作为类构造函数的参数来完成,例如:

public class Quotation
{
    public int ID { get; set; }
    public int QuotationReference { get; set; }

    [Display(Name = "Version")]
    public int VersionNo { get; set; }

    private readonly DbContext _context;

    public Quotation(DbContext context)
    {
        _context = context;
    }

    public string VersionDisplay
    {
        get
        {
            if (_context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Count() > 0)
            {
                return VersionNo.ToString() + "/" + _context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Select(s => s.VersionNo).First();
            }
            return "";
        }
    }
}

尽管另一种选择是在实例化类后设置类的属性。

编辑 在注释中进行澄清之后,如果代码是自动生成的代码(例如通过 EF),您可以将逻辑分离到分部类中的方法中,然后将上下文作为参数传递给该方法,例如:

public partial class Quotation
{
    public string GetVersionDisplay(DbContext context)
    {
        if (context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Count() > 0)
        {
            return VersionNo.ToString() + "/" + context.Quotations.Where(s => s.QuotationReference == QuotationReference).OrderByDescending(s => s.VersionNo).Select(s => s.VersionNo).First();
        }
        return "";
    }
}

然后您应该能够迭代您的报价列表并致电

quotation.GetVersionDisplay(_context)
© www.soinside.com 2019 - 2024. All rights reserved.