У меня есть класс с множеством свойств типа IDbSet<SomeClass>
:
public InMemoryContext : IContext
{
public IDbSet<ClassA> ClassASet { get; set; }
public IDbSet<ClassB> ClassBSet { get; set; }
[...]
public void SaveChanges()
{
//TODO: this is relevant part
}
}
Все эти свойства создаются в конструкторе:
public InMemoryContext
{
ClassASet = new InMemoryDbSet<ClassA>();
[...]
}
У InMemoryDbSet
есть один подходящий метод для ответа на этот вопрос:
public class InMemoryDbSet<T> : IDbSet<T> where T : class
{
public void SaveChanges()
{
[...]
}
}
Я хотел бы получить все свойства, которые IDbSet
, и вызвать SaveChanges()
для них в цикле, поэтому мне не нужно повторять все имена наборов второй раз.
Я пробовал с отражением, но так как мои свойства общие, я не могу заставить его работать. Я попытался сделать ClassA
и ClassB
производными от одного и того же общего интерфейса, но все равно не повезло.
Можно ли это сделать без явного указания всех наборов? Что мне нужно изменить, чтобы добиться такого результата?
Я представляю себе псевдокод:
public void SaveChanges()
{
foreach(var set in GetDbSetsFromClass(this))
{
set.SaveChanges();
}
}
С размышлением я попробовал:
public void SaveChanges()
{
SaveChangesCalled = true;
var properties = GetType().GetProperties().Where(p => p.PropertyType.IsInterface && typeof(IDbSet<IEntity>).IsAssignableFrom(p.PropertyType)).Cast<InMemoryDbSet<IEntity>>();
foreach (var property in properties)
{
CallSaveChanges(property);
}
}
И список пуст. Public bool SaveChangesCalled {get; набор; }
private static void CallSaveChanges<T>(InMemoryDbSet<T> set) where T : class
{
set.SaveChanges();
}
РЕДАКТИРОВАТЬ: общедоступные свойства должны оставаться видимыми на верхнем уровне класса InMemoryContext
, поскольку это ограничено интерфейсом, определяющим контекст EF.
SaveChanges
метод? Не могу найти в документации? Что это заIDbSet<T>
опубликуйте определение интерфейса. - person Sriram Sakthivel   schedule 15.09.2014InMemoryDbSet
имеет, как показано в коде.IDbSet
нет. Я думаю, это самая сложная часть. - person Episodex   schedule 15.09.2014