c# - 更新值对象或在数据库中插入新记录
问题描述
我有一个 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);
}
}
解决方案
如果 Receiver 是一个值对象,那么应该是不可变的。出于这个原因,那个类不应该有那些可能会改变对象状态的setter方法。接收器只能在从数据库查询时显式创建或由 ORM 层创建。
推荐阅读
- python - Anaconda 显示 spyder 4.2.5,但启动 5.0.3
- javascript - React.js如何发送数组到反应路由器
- java - Java 方法与成员同步
- oracle - 如何以不同的方式处理 PL/SQL 中的不同异常?
- javascript - 获取 HH:mm:ss、mm:ss 正则表达式
- woocommerce - 自定义字段中的 Woocommerce 搜索
- python - Colab 中的 TensorFlow 2.5 更新破坏了 keras 代码
- c# - 数组数据每隔一帧就有意外数据
- python - 使用天数列更新python中的日期字段
- python - 多选/选择框在第一次选择后不等待 - Streamlit