使用实体框架添加或更新实体的正确方法是什么

时间:2017-11-27 11:08:39

标签: c# entity-framework-6

我正在尝试从休息端点提取数据并将其保存到数据库中。但是,如果记录已经存在,我想更新它,或者当它还不存在时创建它。

我有以下代码:

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();
        }
    }

哪种方法对我想要的行为更有效?如果有的话?

1 个答案:

答案 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)中发送其他标志。