考虑将这两个 POCO 类与 EF Code First 一起使用。
public class Sale
{
public int SaleId { get; set; }
public DateTime Date { get; set; }
public double Amount { get; set; }
}
public class History
{
public int HistoryId { get; set; }
public DateTime Date { get; set; }
public double Total { get; set; }
}
这一切都很好,但我实际上希望我的类在我的应用程序中使用它时表现得更多:
public class SaleWithAllIWant
{
public int SaleId { get; set; }
public DateTime Date { get; set; }
public double Amount { get; set; }
public double Calculation // Read only and NOT stored in DB
{
get
{
// Obtain Total from _Context.History on Date
// Perform Calculation
}
}
}
我希望能够使用 EF 的美感并能够做类似的事情:
gridSales.DataSource = _Context.Sales.ToList();
但是 Sale 没有我的所有信息。 SaleWithAllIWant 不是上下文,因此我必须进行某种后期处理,以获取从 Sale 到 SaleWithAllIWant 的所有内容。我可以使用未绑定(bind)的列或类似列,但它会变得困惑并开始影响性能。
我不能只将 SaleWithAllIWant 放在我的 POCO 类中,因为计算需要历史上下文的知识。我的 DAL 项目(它创建了 DbSet)引用了我的模型项目(它包含 POCO 类)——因此模型项目无法引用 DAL 来访问上下文,因为这将是一个循环引用。
解决方案是将它们全部捆绑在一起而不使用单独的 DAL 和模型项目吗?
我怀疑我缺少更好的方法。非常感谢所有评论。
最佳答案
如果您不单独部署它们,那么将 DAL 和模型合并在一起绝对是我会考虑的一个选项。
也就是说,Calculation
看起来很适合扩展方法:
public static class SaleExtensions
{
public static double Calculation(this Sale sale)
{
// Obtain Total from _Context.History on Date
// Perform Calculation
}
}
它可以存在于您的 DAL 项目中。如果为了进行计算而需要在 Sale 中保留任何其他属性,只需使用 [NotMapped]
标记它们,这样 EF 就会忽略它们。
关于c# - 扩展 POCO 类以使用其他上下文进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540526/