这不是我的场景,但我构建了这个示例来找出如何解决我的问题。使用 Entity Framework 我有以下模型;
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 属性。我可以做到这一点,但我的解决方案确实很笨拙,需要获取玩家记录并在存款后进行更新。我想知道执行此操作的“最佳实践”方法是什么?
最佳答案
假设 player_balance
是该玩家的 Deposit_Transactions
的某种聚合,我强烈建议您从相应的数据库表中删除 player_balance
。目前,您的模型是非规范化的,在多个位置存储相同的概念信息,从而使其不同步。
这是一个更大的问题,不仅限于您的 EF 模型,还会增加整个系统出现错误的可能性。
您可以从表中删除该列,并将 player_balance
更改为只读计算属性,保留其便利性。
public partial class Player
{
public decimal player_balance =>
Deposit_Transactions.Sum(transaction => transaction.transaction_amount);
}
关于C# 添加新子对象时更新父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276007/