Мне действительно нравится предложение здесь: Moq Entity Frameworks ExecuteSQLCommand . На самом деле это не издевательство над всей функцией, а ExecuteSqlCommand
, добавив оболочку в вашем контексте:
Итак, в вашем классе контекста
public class MyContext : DbContext
{
public virtual int ExecuteSqlCommand(string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(sql, parameters);
}
public virtual int ExecuteSqlCommand(TransactionalBehavior transactionalBehavior, string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(transactionalBehavior, sql, parameters);
}
// The rest of the implementation
Так что теперь вы можете смоделировать контекст, и так как функции являются vitrual, вы можете издеваться над ними тоже. Вам нужно всего лишь изменить свой код следующим образом:
public void SaveOrUpdate(MyEntity entity)
{
var sql = @"MERGE INTO MyEntity
USING
(
SELECT @id as Id
@myField AS MyField
) AS entity
ON MyEntity.Id = entity.Id
WHEN MATCHED THEN
UPDATE
SET Id = @id
MyField = @myField
WHEN NOT MATCHED THEN
INSERT (Id, MyField)
VALUES (@Id, @myField);"
object[] parameters = {
new SqlParameter("@id", entity.Id),
new SqlParameter("@myField", entity.myField)
};
context.ExecuteSqlCommand(sql, parameters);
}