实体框架7(Beta 7)和实体跟踪

Lut*_*ndo 6 entity-framework-core

我试图将我的域模型(负责我的业务逻辑)与我的数据模型分开,这是EF 7用来构建我的模式的.

关于将我的域模型的更改持久保存到我的数据库,我遇到了一个问题

所以例如,假设我有数据模型PersonTable和Domain模型Person:

public class PersonTable
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
}

public class Person
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
    //Other Domain Methods and Constructors...
}
Run Code Online (Sandbox Code Playgroud)

我想通过这样做将我的域更改保留到我的数据库:

public void Update(Person p)
{
    var person = new PersonTable
    {
        Id = p.Id,
        Name = p.Name,
        Surname = p.Surname
    }
    PersonDbContext.Update(person);
    PersonDbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试应用这些更改时,我得到一个InvalidOperationException说

"无法跟踪实体类型'Tables.PersonTable'的实例,因为已经跟踪了具有相同密钥的此类型的另一个实例.对于新实体,请考虑使用IIdentityGenerator生成唯一键值."

我认为这与实体跟踪有关,但这在EF 7中如何工作?我希望能够应用这种模式,以便我可以分离这两个模型.

小智 8

// Before updating we have fetch original data row from database.
// So we need to use AsNoTracking().

var originalPerson = PersonDbContext.Person.AsNoTracking().FirstOrDefault(p => p.Id == id);
Run Code Online (Sandbox Code Playgroud)

在保存时我们需要使用以下代码.

PersonDbContext.Entry(originalPerson).Context.Update(newPersonDetail);
Run Code Online (Sandbox Code Playgroud)


nat*_*ter 3

当您的实例已经在跟踪具有相同 IDPersonDbContext的实例时,就会出现此错误。Person

要调试此问题,请检查您已经在PersonDbContext.ChangeTracker.Entries(). 我希望您会发现您已经有一个与PersonTable.Id您尝试更新的条目相匹配的条目。

为了确保您不会遇到这些冲突,请不要PersonDbContext跨线程或多个 HTTP 请求重用(如果这是一个 Web 应用程序)。