首页 > 解决方案 > 更新值对象或在数据库中插入新记录

问题描述

我有一个 Ticket 表和它的 Receivers,它是一个集合。接收者是一个值对象。

我在 EF Core 2.2 中定义了所有内容,一切正常。

插入新票时,接收者被添加到票中并被保存。

对于更新票证,由于值对象是不可变的,我应该更新接收器表还是插入新的接收器?

我的意思是这样:只需更新已更改的属性

    public void AddOrUpdateReceiver(long? ticketId, long? referenceId, int responsibleId, int category, string note)
    {
        var existingReceiver = _receivers.FirstOrDefault(q => q.ResponsibleId == responsibleId);
        if (existingReciever == null)
        {
            var receiver = new Receiver(ticketId, referenceId, responsibleId, category, note);
            _receivers.Add(receiver);
        }
        else
        {
            existingReceiver.SetNote(note);
            existingReceiver.SetReferenceId(category);
            existingReceiver.SetCategory(category);
        }
    }

或者这样:插入带有新 ID 的新行

    public void AddOrUpdateReceiver(long? ticketId, long? referenceId, int responsibleId, int category, string note)
    {
        var existingReceiver = _receivers.FirstOrDefault(q => q.ResponsibleId == responsibleId);
        if (existingReceiver == null)
        {
            var receiver = new Receiver(ticketId, referenceId, responsibleId, category, note);
            _receivers.Add(receiver);
        }
        else
        {
            existingReceiver = new Receiver(ticketId, referenceId, responsibleId, category, note);
        }
    }

标签: c#domain-driven-designaggregaterootvalue-objectsef-core-2.2

解决方案


如果 Receiver 是一个值对象,那么应该是不可变的。出于这个原因,那个类不应该有那些可能会改变对象状态的setter方法。接收器只能在从数据库查询时显式创建或由 ORM 层创建。


推荐阅读