在Entity Framework 6中更新多2多次关系会将新项插入数据库

问题描述

我正在尝试使用下面的功能来更新数据库条目,包括多对多关系。但是,即使对象的ID字段设置为数据库中现有TiMetable的ID,下面的代码也会向数据库中插入新的TiMetable条目。我已经阅读了有关attach方法的信息,但是当我尝试进行附加操作时,我收到错误消息:“由于时间表的另一个类型相同的实体已经具有相同的主键值,所以附加了类型为Table的实体失败”。

public void UpdatePersonGroup(PersonGroup pg)
{
    PersonGroup pgorg = this.DB.PersonGroups.Where(b => b.Id == pg.Id).Include(i => i.TiMetables).FirstOrDefault();

    if (pgorg == null)
        return;

    pgorg.Name = pg.Name;
    pgorg.Detail = pg.Detail;
    pgorg.Fee = pg.Fee;
    pgorg.TiMetables.Clear();

    foreach (var tt in pg.TiMetables)
    {
        //var query = this.DB.TiMetables.Where(i => i.Id == tt.Id).FirstOrDefault();
        //this.DB.TiMetables.Attach(tt);        
        pgorg.TiMetables.Add(tt);                
    }

    this.DB.SaveChanges();
}

如果我首先像这样从数据库获取时间表项,一切都会按预期进行,

var query = this.DB.TiMetables.Where(i => i.Id == tt.Id).FirstOrDefault();

但是,这导致对数据库的多个请求。

解决方法

执行此操作:

DB.PersonGroups.Update(pgorg);

而不是 foreach循环。

使用“添加”时,它会指示EF创建新项目。 还有UpdateRange来更新项目集合

编辑:我对EF版本感到困惑,更新方法在EF Core中。在EF 6中,无需“添加”或“更新”,只需执行“ SaveChanges”。