2

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

使用 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 { }
    }
}

将有一个 AffiliateCommissions 列表,我想根据状态获得所有佣金的总数。也许将它存储在不同的模型中?需要一些实施建议。

4

2 回答 2

2

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

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

于 2012-12-10T07:00:24.830 回答
1

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

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

于 2012-12-10T12:55:45.830 回答