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

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

这不是我的场景,但我构建了这个示例来找出如何解决我的问题。使用 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/

相关文章:

entity-framework - Entity Framework 6 延迟加载和查询导航属性

c# - Entity Framework 关系映射中的错误

c# - 位置 C# 位置文本

c# - 使用 AES 加密任何文件

c++ - Visual Studio 的 "preprocess current file"插件? (C++)

c# - 如何对可以属于多个聚合的 ValueObject 进行建模

c# - 双向冒泡排序 C#

c# - 使用 Entity Framework 4 缓存 Linq to Entities 执行计划

c++ - 如何在 Visual Studio 中查看模板编译器错误详细信息

visual-studio - 如何获取 Visual Studio Express 的序列号?