Метод обновления для универсального репозитория Entity Framework - PullRequest
4 голосов
/ 28 июля 2011

У меня есть такой репозиторий:

public class Repository<T> : IRepository<T> where T : class 
{
    private readonly IRepositoryContext _repositoryContext;

    public Repository(IRepositoryContext repositoryContext)
    {
        _repositoryContext = repositoryContext;
        _objectSet = repositoryContext.GetObjectSet<T>();
    }

    public virtual void Update(T entity)
    {
        ObjectSet.AddObject(entity);
        _repositoryContext.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        _repositoryContext.SaveChanges();
    }
  }

Теперь это действительно работает для всех скалярных свойств объекта, но все остальные объекты, которые связаны со свойствами объекта typeOf(T), не волнуютэто состояние объекта изменяется, и EF просто добавляет новые данные.

Итак, если вы, например, наберете Repository<Student>.Update(), и вы только изменили имя, он найдет нужного студента и изменит его имя, но также изменит кампус, хотя у вас уже есть связанный кампусс этим студентом, он будет снова создан с другим CampusId.

Покажите мне, пожалуйста, правильный способ обновления в этой ситуации.

1 Ответ

4 голосов
/ 28 июля 2011

То, что я делал, когда хотел следовать универсальному подходу, было переведено в ваш код примерно так:

public class Repository<T> : IRepository<T> where T : class 
{
    ...

    public virtual void Update(T entity)
    {
        if (context.ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Detached)
        {
            throw new InvalidOperationException(...);
        }

        _repositoryContext.SaveChanges();
    }
}

Тогда весь мой код работал так:

var attachedEntity = repository.Find(someId);
// Merge all changes into attached entity here
repository.Update(attachedEntity);

=> Выполнение этого в общем виде перемещает много логики на ваш верхний уровень. Нет лучшего способа сохранить большие отсоединенные графы объектов (особенно когда задействованы отношения «многие ко многим» и удаление связей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...