настоящее время я использую метод расширения для общего фиктивных DbSets в виде списка:Есть ли способ обобщить метод DbSet.Find с помощью Moq?
public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
mockDbSet.Setup(x => x.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
mockDbSet.Setup(x => x.Remove(It.IsAny<T>())).Returns<T>(x => { if (sourceList.Remove(x)) return x; else return null; });
return mockDbSet.Object;
}
Однако, я не могу понять способ поиздеваться метод Find, который поиска на основе первичного ключа таблицы. Я мог бы сделать это на определенном уровне для каждой таблицы, потому что я могу проверить базу данных, получить PK, а затем просто высмеять метод Find для этого поля. Но тогда я не могу использовать общий метод.
Я полагаю, что я мог бы также добавить к частичным классам, которые автогенерирует EF, чтобы отметить, какое поле является PK с атрибутом или чем-то еще. Но у нас есть более 100 таблиц, и это затрудняет управление кодом, если вы полагаетесь на людей, чтобы их вручную поддерживать.
Предоставляет ли EF6 какой-либо способ поиска первичного ключа или он знает только динамически после его подключения к базе данных?
вы ищете что-то вроде этого: [link] (http://stackoverflow.com/a/25199983/5048049), иначе вы могли бы лучше объяснить, что вы ищете? – peval27
Это первая альтернатива, которую я описал. Это делает конкретный макет только для набора ActiveLoan, а не для общего макета для любого общего набора. –