Я записал скринкаст с моей проблемой, вы можете найти его here, пожалуйста, смотрите, если у вас есть время.Entity Framework создает дубликаты сущностям
У меня есть следующий код, который должен выполнять функциональность 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 имеет значение null, поэтому его всегда рассматривают как Add. – Maess
Вы установили некоторые точки останова и посмотрели, что происходит? – MaxSC