【问题标题】:Proper way to have an calculated field in EF Code First在 EF Code First 中拥有计算字段的正确方法
【发布时间】:2012-11-27 13:30:44
【问题描述】:

我在 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 { }
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,是的,我不需要它来进行任何繁重的报告或任何事情,所以也许我正在错误地查看解决方案。我只是想找出在我的 asp.net MVC 控制器中引入一组 AffiliateCommisions 的最佳途径,将该列表返回视图,并以简单的方式在视图中为我提供某些记录的总和,最好避免使用js。对不起,如果这没有意义。一直在进行编码死亡行军,目前是凌晨 1 点。
    • @davidisawesome 如果您使用的是强类型视图,那么您应该能够像访问其他任何属性一样访问您的计算属性。如果没有,您可以改用视图模型。也许您的属性并没有计算您真正想要的 - 目前看起来TotalUnpaid 将始终查看 this.Amount 仅用于当前记录。如果你想跨记录求和,那么这个类可能不适合它
    【解决方案2】:

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

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

    【讨论】:

    • 我同意,当我有现有数据时,我在尝试首先编写代码时遇到了很多痛苦。我认为正确的方法是通过我们的项目插入数据(如果迁移)。不过,每次数据库表更改都必须一遍又一遍地重新创建模型也很痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多