Дразнить или подделывать DbEntityEntry или создавать новый DbEntityEntry - PullRequest
60 голосов
/ 18 февраля 2011

Следуя по пятам моего другого вопроса о издевательстве 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;

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

Проблема, с которой я сталкиваюсь, заключается в том, как мне справиться с

Context.Entry(entity).State.

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

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

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

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

Ответы [ 2 ]

92 голосов
/ 18 февраля 2011

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

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.

0 голосов
/ 03 января 2019

Нашел этот вопрос, когда мне нужно было провести модульное тестирование с Moq, нет необходимости в вашем собственном интерфейсе. Я хотел установить определенные поля не измененными, но метод SetModified можно использовать и с объектом.

DbContext:

public class AppDbContext : DbContext
{   
    ...
    public virtual void SetModified(GuidEntityBase entity)
    {
        Entry(entity).State = EntityState.Modified;
        Entry(entity).Property(x => x.CreatedDate).IsModified = false;
        Entry(entity).Property(x => x.CreatedBy).IsModified = false;
    }
    ...
}

Тест:

var mockContext = new Mock<AppDbContext>();
mockContext.Setup(c => c.MyDbSet).Returns(mockMyDbSet.Object);
mockContext.Setup(c => c.SetModified(It.IsAny<GuidEntityBase>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...