2012-01-20 5 views
1

Есть ли способ провести сравнение объектов для равенства в общем случае без объектов с идентификатором?Entity Framework: общий тип сравнения без Id?

Я пытаюсь сделать типичное родовое обновления, для которых я видел много примеров в Интернете, но все они, как правило, выглядят примерно так:

public void Update(TClass entity) 
{ 
    TClass oldEntity = _context.Set<TClass>().Find(entity.Id); 
    foreach (var prop in typeof(TClass).GetProperties()) 
    { 
     prop.SetValue(oldEntity, prop.GetValue(entity, null), null); 
    } 
} 

или что-то similar.The проблема с моей системой является что не каждый класс имеет свойство Id, в зависимости от класса Id может быть ClassnameId. Так или иначе, я должен проверить наличие и возвращение такого объекта через LINQ без предоставления каких-либо свойств в целом?

ответ

1

Попробуйте

public void Update(TClass entity) 
{ 
    var oldEntry = _context.Entry<TClass>(oldEntity); 

    if (oldEntry.State == EntityState.Detached) 
    { 
     _context.Set<TClass>().Attach(oldEntity); 
    } 

    oldEntry.CurrentValues.SetValues(entity); 
    oldEntry.State = EntityState.Modified; 
} 
+0

Thannks, от того, что я читал, хотя значения обновления обновляет только сложные и скалярные свойства, но не навигационные свойства? Так значит ли это, если у меня есть пользователь, который имеет коллекцию групп и удаляет одну группу и обновляет, это изменение не будет применяться к CurrentValues.SetValues? Или это просто означает, что я не могу изменить и обновить фактический объект группы с помощью этого метода на объекте пользователя? http://stackoverflow.com/questions/6974660/entity-framework-generic-repository. Также есть ли опечатки в вашем коде? Кажется, что Entry должен воспринимать объект как параметр, и он отделяется, если я только что получил его из db? – SventoryMang

+0

@DOTang Вы правы в отношении навигационных свойств. Общий метод обновления не будет работать для всех случаев. Я не компилировал вышеуказанный код. Так что, возможно, опечатки – Eranga

+0

@Erange Спасибо Eranga, но можете ли вы прояснить, что это значит. Если у меня есть объект User с ICollection of Groups. Означает ли это, что: а) если я удаляю группы из этой коллекции конкретного пользователя и обновляю пользователя, удаленные изменения групп не будут сохранены или б) это означает, что если я попытаюсь изменить фактический объект группы (скажем, я меняю свойство name) из коллекции и обновить пользователя, изменения объекта группы не будут сохранены? – SventoryMang

Смежные вопросы