Подтвердить что ты не робот

Издевательская или фальсификация DbEntityEntry или создание новой DbEntityEntry

Следуя за моим другим вопросом насчет насмешки DbContext.Set У меня есть еще один вопрос насчет насмешек EF Code First.

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

if (entity == null)
    throw new ArgumentNullException("entity");

Context.GetIDbSet<T>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
Context.CommitChanges();

return entity;

Контекст - это интерфейс моего собственного DbContext.

Проблема, с которой я работаю, - это как я обрабатываю

Context.Entry(entity).State.

Я прошел через этот код, и он работает, когда у меня есть реальный живой DbContext в качестве реализации моего интерфейса Context. Но когда я помещаю свой поддельный контекст, я не знаю, как с ним справиться.

Нет конструктора для класса DbEntityEntry, поэтому я не могу просто создать новый в моем поддельном контексте.

Кто-нибудь имел какие-либо успехи с издевательством или подделкой DbEntityEntry в ваших решениях CodeFirst?

Или есть лучший способ справиться с изменениями состояния?

4b9b3361

Ответ 1

Как и в другом случае, вам нужно добавить дополнительный уровень косвенности:

interface ISalesContext
{
    IDbSet<T> GetIDbSet<T>();
    void SetModified(object entity)
}

class SalesContext : DbContext, ISalesContext
{
    public IDbSet<T> GetIDbSet<T>()
    {
        return Set<T>();
    }

    public void SetModified(object entity)
    {
        Entry(entity).State = EntityState.Modified;
    }
}

Итак, вместо вызова реализации вы просто вызываете SetModified.