編輯
我錄了一段截屏與我的問題,你可以找到它here,請看,如果你有時間。實體框架創建重複實體
我有下面的代碼應該執行AddOrUpdate功能,而是所有現有的記錄被重新創建,因此我有幾個紐約,幾個美國的。我從客戶端傳輸EntityState,以便如果客戶端上的數據發生更改,客戶端會相應地更新EntityState屬性並將其發送到服務器。
[HttpPost, HttpGet, HttpPut]
public HttpResponseMessage SaveRecord(RecordViewModel record)
{
var model = Mapper.Map<Record>(record);
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
db.Attach(model);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
return Request.CreateResponse(HttpStatusCode.OK, Mapper.Map<RecordViewModel>(model));
}
我附加實體具有以下功能
public void AttachAndMarkAs<T>(T entity, EntityState state, Func<T, object> id) where T : class
{
var entry = Entry(entity);
if (entry.State == EntityState.Detached)
{
var set = Set<T>();
T attachedEntity = set.Find(id(entity));
if (attachedEntity != null)
{
var attachedEntry = Entry(attachedEntity);
if (state != EntityState.Unchanged)
{
attachedEntry.CurrentValues.SetValues(entity);
attachedEntry.State = state;
}
}
else
{
entry.State = state;
}
}
}
這是通過以下的人轉述:
public void Attach(City entity)
{
if (entity != null)
{
Attach(entity.Country);
AttachAndMarkAs(entity, entity.EntityState ?? EntityState.Added, instance => instance.Id);
}
}
public void Attach(Country entity)
{
if (entity != null)
{
AttachAndMarkAs(entity, entity.EntityState ?? EntityState.Added, instance => instance.Id);
}
}
我不明白這部分的代碼添加手柄實體而不是更新它們,因爲EntityState值是正確的...
如果你說「我不知道哪一部分呢?」不那意味着你從別處複製了代碼? –
您的EntityState爲空,因此它始終將其視爲Add。 – Maess
您是否設置了一些斷點並查看發生了什麼? – MaxSC