添加新子代时,C#更新父代对象

时间:2018-09-11 12:31:34

标签: c# visual-studio entity-framework-6

不是我的情况,但是我构建了此示例以查找解决问题的方法。使用实体框架,我有以下模型;

namespace ClassTesting.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Player
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Player()
        {
            this.Deposit_Transactions = new HashSet<Deposit_Transactions>();
        }

        public long id { get; set; }
        public string player_name { get; set; }
        public decimal player_balance { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Deposit_Transactions> Deposit_Transactions { get; set; }
    }
}

namespace ClassTesting.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Deposit_Transactions
    {
        public long id { get; set; }
        public System.DateTime transaction_date { get; set; }
        public decimal transaction_amount { get; set; }
        public long fk_player_id { get; set; }

        public virtual Player Player { get; set; }
    }
}

因此,玩家可以有很多Deposit_Transactions。

我想要做的是每当发布新的Deposit_Transaction时,更新玩家的player_balance属性。我可以做到,但是我的解决方案确实很笨拙,涉及到提取玩家记录并在存款后进行更新。我想知道什么是“最佳实践”方法?

1 个答案:

答案 0 :(得分:2)

假设player_balance是该玩家的Deposit_Transactions的某种聚集,我强烈建议您从相应的数据库表中删除player_balance。当前,您的模型已被非规范化,将相同的概念信息存储在多个位置,从而使其不同步。

这是一个更大的问题,不仅限于您的EF模型,还会增加整个系统中出现错误的可能性。

您可以从表中删除该列,并将player_balance更改为只读的计算属性,从而保持其便利性。

public partial class Player
{
    public decimal player_balance => 
        Deposit_Transactions.Sum(transaction => transaction.transaction_amount);
}