c# - 扩展 POCO 类以使用其他上下文进行计算

标签 c# entity-framework code-first poco data-access-layer

考虑将这两个 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/

相关文章:

entity-framework - 如何首先使用实体​​框架代码更新一行?

entity-framework - EntityFramework Core 中的 DeleteBehavior.NoAction 和 DeleteBehavior.Restrict 有什么不同?

c# - 将 Entity Framework Linq 查询打印为字符串

c# - 在 Linq 中不符合条件

c# - 如何从 WPF 中的代码隐藏中删除控件的属性

code-first - Code First 和父子引用

entity-framework - Entity Framework 代码首先为现有表进行多对多设置

c# - "Object reference not set to an instance of an object"错误

c# - 在 .NET Core 解决方案中同时拥有 API 和 MVC 项目的约定

c# - 我的 Controller 中的非静态字段、方法或属性需要对象引用