0

У меня есть класс BaseRepository, который используется всеми хранилищами для сохранения объектов (новые или обновленные):Entity Framework 4: Каков наилучший способ добавить и сохранить объект?

public abstract class BaseRepository 
{ 
    protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class 
    { 
     if (isNew) 
     { 
      context.CreateObjectSet<T>().AddObject(source); 
     } 
     else 
     { 
      if (state == EntityState.Detached) 
      { 
       context.CreateObjectSet<T>().Attach(source); 
      } 
     } 
    } 

    protected void Save(MyEntities context) 
    { 
     context.SaveChanges(); 
    } 
} 

Это называется так:

public class MyEntityRepository : BaseRepository 
{ 
    public void Add(MyEntity source, MyEntities context) 
    { 
     base.Add(source, context, source.ID == Guid.Empty, source.EntityState); 
    } 

    public void Save(MyEntities context) { 
     base.Save(context); 
    } 
} 

Вопрос

Когда вызывается base.Save(), нет никакой разницы в данных, EntityState не изменяется. Я предполагаю, что это связано с тем, что загрузка была на другом экземпляре Context, поэтому текущий контекст не знает о каких-либо изменениях.

Как изменить приведенный выше код, чтобы исходный экземпляр имел EntityState Modified (чтобы он работал)?

+0

Вы используете инъекцию зависимости? Если вы, вы можете установить свой DbContext как одноточечный запрос, и каждый раз он будет тем же самым экземпляром объекта. – Luke

+0

Я использую UnitOfWork на уровне домена. – Spikee

ответ

0

Я нашел решение:

protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class 
{ 
    if (isNew) 
    { 
     context.CreateObjectSet<T>().AddObject(source); 
    } 
    else 
    { 
     if (state == EntityState.Detached) 
     { 
      context.CreateObjectSet<T>().Attach(source); 

      context.ObjectStateManager.ChangeObjectState(source, EntityState.Modified); 
     } 
    } 
} 

Большое различие заключается в следующем:

context.ObjectStateManager.ChangeObjectState (источник, EntityState.Modified);

Таким образом, я могу изменить EntityState исходного объекта, поэтому он фактически обновляется.

+0

Странно, я бы подумал, когда вы используете AddObject, это делает это для вас. Замечания для 'AddObject' [здесь] (https://msdn.microsoft.com/en-us/library/bb896271 (v = vs.100) .aspx) говорит' Добавляет объект и связанные с ним объекты в ObjectContext и устанавливает объект помещается в добавленное состояние. – Luke

+0

Я сейчас запутался в методе. Потому что у вас есть метод «Добавить», но вы передаете состояние сущности, почему? Все, что передавалось методу Add, должно быть просто установлено в 'EntityState.Added' и никогда' EntityState.Modified' – Luke

+0

Из-за общей сложности мне нужно реализовать шаблон UoW на уровне домена, что означает, что я не могу/не буду работать над одним и тем же экземпляром контекста. Это означает, что я буду передавать экземпляры, которые не привязаны к новому, текущему экземпляру контекста. Поэтому мне нужно проверить это. AddObject - это хорошо, кстати, это бит else (update), который ранее не работал. – Spikee

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