不是我的情况,但是我构建了此示例以查找解决问题的方法。使用实体框架,我有以下模型;
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属性。我可以做到,但是我的解决方案确实很笨拙,涉及到提取玩家记录并在存款后进行更新。我想知道什么是“最佳实践”方法?
答案 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);
}