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)
当您的实例已经在跟踪具有相同 IDPersonDbContext的实例时,就会出现此错误。Person
要调试此问题,请检查您已经在PersonDbContext.ChangeTracker.Entries(). 我希望您会发现您已经有一个与PersonTable.Id您尝试更新的条目相匹配的条目。
为了确保您不会遇到这些冲突,请不要PersonDbContext跨线程或多个 HTTP 请求重用(如果这是一个 Web 应用程序)。
| 归档时间: |
|
| 查看次数: |
5270 次 |
| 最近记录: |