【问题标题】:Extending POCO class to make calculations using other contexts扩展 POCO 类以使用其他上下文进行计算
【发布时间】:2012-11-12 11:51:30
【问题描述】:

考虑将这两个 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。我可以使用未绑定的列或类似的列,但它会变得混乱并开始影响性能。

我不能只将 SaleWithAllIWant 放在我的 POCO 课程中,因为计算需要了解历史上下文。我的 DAL 项目(创建 DbSet)引用了我的模型项目(包含 POCO 类)——因此模型项目无法引用 DAL 来访问上下文,因为它是循环引用。

解决方案是将它们全部组合在一起而不具有单独的 DAL 和模型项目吗?

我怀疑我错过了更好的方法。非常感谢所有 cmets。

【问题讨论】:

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


    【解决方案1】:

    如果您不单独部署它们,我绝对会考虑将 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 忽略它们。

    【讨论】:

    • 谢谢@Serge。合并可能是要走的路。扩展方法是个好主意,尽管我不能像绑定到 Sale 类中的属性一样绑定到扩展方法,对吗?我仍然需要使用某种调用扩展的未绑定列吗?谢谢
    • @user1622713 我不完全确定您绑定到什么(看起来像 WebForms 或 WinForms 中的 DataGrid),但您绝对应该能够在不扩展模型的情况下显示计算值。如果您能提供更多详细信息,那就更容易回答了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-09-17
    • 2019-03-22
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多