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

时间:2012-11-24 10:56:51

标签: 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的所有内容。我可以使用未绑定的列或类似的但它会变得混乱并开始影响性能。

我不能将SaleWithAllIWant放在我的POCO类中,因为计算需要了解History上下文。我的DAL项目(创建DbSets)引用了我的Model项目(它包含POCO类) - 因此Model项目不能引用DAL来访问上下文,因为它将是一个循环引用。

解决方案只是将它们全部打包在一起而没有单独的DAL和Model项目吗?

我怀疑我错过了一种更好的方式。所有评论都非常赞赏。

1 个答案:

答案 0 :(得分:1)

将DAL和Model合并在一起绝对是我考虑的一个选项,如果你没有单独部署它们。

那就是说,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忽略它们。