C # обновляет родительский объект при добавлении нового потомка - PullRequest
0 голосов
/ 11 сентября 2018

Не мой сценарий, но я построил этот пример, чтобы узнать, как решить мою проблему. Используя 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 игрока. Я могу сделать это, но мое решение действительно неуклюже и включает в себя выборку игрока и обновление после внесения депозита. То, что я хочу знать, - что такое метод «наилучшей практики» для этого?

1 Ответ

0 голосов
/ 11 сентября 2018

Предполагая, что player_balance - это некоторая агрегация Deposit_Transactions этого игрока, я настоятельно рекомендую удалить player_balance из соответствующей таблицы базы данных.В настоящее время ваша модель денормализована, она хранит одну и ту же концептуальную информацию в нескольких местах и, таким образом, позволяет ей не синхронизироваться.

Это более серьезная проблема, не ограничивающаяся вашей моделью EF, увеличивающая вероятность ошибок во всемвся система.

Вы можете удалить столбец из таблицы и преобразовать player_balance в вычисляемое свойство только для чтения, сохранив его удобство.

public partial class Player
{
    public decimal player_balance => 
        Deposit_Transactions.Sum(transaction => transaction.transaction_amount);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...