在EF Code First中使用计算字段的正确方法

时间:2012-12-10 06:02:06

标签: c# entity-framework ef-code-first calculated-columns

我在SO上引用了这个问题:

Store read-only calculated field with Entity Framework Code First

他们正在做的事情是有道理的,但我正在尝试一些不同的东西,并且不确定我的实施是否正确,或者是否有更简单的方法来做到这一点:

public class AffiliateCommission
{
    public int Id { get; set; }
    public Merchant Merchant { get; set; }
    public AffiliateCommissionType Type { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int Amount { get; set; }
    public string Status { get; set; }
    public DateTime RecievedDate { get; set; }
    public int TotalPaid { get 
    {
        if (Status == "Paid")
        {
            return this.Amount += this.Amount;
        }
        return 0;
    }
        protected set { }
    }


    public int TotalUnpaid
    {
        get
        {
            if (Status == "Unpaid")
            {
                return this.Amount += this.Amount;
            }
            return 0;
        }
        protected set { }
    }
    public int TotalInvoiced
    {
        get
        {
            if (Status == "Invoiced")
            {
                return this.Amount += this.Amount;
            }
            return 0;
        }
        protected set { }
    }
}

会有一份联盟委员会名单,我希望根据状态获得所有佣金的总数。可以将它存放在不同的型号中吗?需要一些实施建议。

2 个答案:

答案 0 :(得分:2)

为什么要尝试保留计算字段?使用属性中的计算逻辑,您可以将属性保留为瞬态,并且每次都可以随时计算。这样就没有必要坚持下去了。你的计算似乎并不昂贵。在业务逻辑发生变化的情况下,这种方法还具有计算值始终准确的优势。

持久存储计算字段的一个用例是报告您希望直接从数据库中提取。如果是这种情况,我建议改为查看mapreduce查询:http://en.wikipedia.org/wiki/MapReduce

答案 1 :(得分:1)

我喜欢EF Code First但我实际上并不是“先编码”。我通常会在数据库中创建模式,并使用EF Code First Powertool进行逆向工程。 Code First的重量更轻,但整个数据库升级过程在开发和生产过程中都很痛苦,因此我发现以旧的方式维护数据库更容易,并通过逆向工程来获取我的实体。

您可以尝试这种方法,在SQL Server中创建计算字段,然后对其进行反向工程以查看生成的代码。