我正在尝试从休息端点提取数据并将其保存到数据库中。但是,如果记录已经存在,我想更新它,或者当它还不存在时创建它。
我有以下代码:
private void Sync()
{
using (var db = new context())
{
// get data from rest endpoint
foreach (var item in array)
{
// create entity
var myEntity = new MyEntity();
// Method 1
db.Entry(myEntity).State = EntityState.Modified;
// Method 2
db.myEntities.AddOrUpdate(e => new { e.att1, e.att2, }, myEntity);
}
db.SaveChanges();
}
}
哪种方法对我想要的行为更有效?如果有的话?
答案 0 :(得分:0)
尝试使用主键从数据库中检索现有实体。如果它不存在,请创建一个新实体。然后将属性映射到检索/创建的实体并保存。
using (var db = new context()) {
// get data from rest endpoint
foreach (var item in array) {
// try to retrieve existing entity
var myEntity = db.MyEntity.Find(item.Id);
// if entity does not already exist -> create new
if (myEntity == null) {
myEntity = new MyEntity();
db.MyEntity.Add(myEntity);
}
// map received values
myEntity.Property1 = item.Property1;
myEntity.Property2 = item.Property2;
}
// EntityState should be set automatically by EF ChangeTracker
db.SaveChanges();
}
关于API设计的旁注:大多数情况下,最好有明确的创建和更新方法,因为这些用例往往不同。例如:如果某些值只能在创建实体时设置(例如CreationTimestamp,CreatedBy),但在更新期间不能设置,如果拆分方法,则可以很好地处理此问题。否则,您必须在命令(IsUpdateUsecase)中发送其他标志。