我試圖將我的域模型(負責我的業務邏輯)與我的數據模型分開,這是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...
}
我想通過執行以下操作將域更改保留到我的數據庫中:
public void Update(Person p)
{
var person = new PersonTable
{
Id = p.Id,
Name = p.Name,
Surname = p.Surname
}
PersonDbContext.Update(person);
PersonDbContext.SaveChanges();
}
當我嘗試應用這些更改時,我得到一個InvalidOperationException
“無法跟踪實體類型'Tables.PersonTable'的實例,因為已經跟踪了具有相同密鑰的此類型的另一個實例。對於新實體,請考慮使用IIdentityGenerator生成唯一鍵值。”
我認為這與實體跟踪有關,但這在EF 7中如何工作?我希望能夠應用這種模式,以便我可以分離這兩個模型。
// 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);
在保存時我們需要使用以下代碼。
PersonDbContext.Entry(originalPerson).Context.Update(newPersonDetail);