У меня есть этот метод, который удаляет швейные карты из моего контекста EF.По сути, у меня есть основной класс SewingCard и около 15 классов, производных от SewingCard.Все эти классы имеют свои собственные DbSets.Я хочу, чтобы этот метод принимал параметр, представляющий собой список смешанных типов производных SewingCard.Поэтому, когда я пишу эту функцию, я действительно не знаю, какой тип швейной карты будет удален, за исключением того, что это швейная карта.Я думал об использовании отражения, и я сделал это, и это работает.Вы можете увидеть код ниже.Но я думаю, что некоторые вещи можно сделать лучше.Например, я делаю
var removeMethod = dbSet.GetType().GetMethod("Remove");
removeMethod.Invoke(dbSet, new[] { sewingCard });
, но я бы хотел сделать это так
dbSet.Remove(sewingCard)
Ниже приведен мой текущий код этого метода
public void RemoveSewingCards(List<SewingCard> sewingCards, ApplicationDbContext context)
{
//getting the properties of context which holds SewingCards
var dbSets = context.GetType().GetProperties()
.Where(p => Attribute.IsDefined(p, typeof(IncludeSewingCards))).ToList();
//iterating through sewingCards list
foreach (var sewingCard in sewingCards)
{
var sewingCardType = sewingCard.GetType();
// getting the correct dbSet for the correct sewingCard
var dbSet = dbSets.FirstOrDefault(d => d.PropertyType.GetGenericArguments()
.Any(a => a == sewingCardType))
.GetValue(context);
//getting the Remove method of dbSet
var removeMethod = dbSet.GetType().GetMethod("Remove");
//calling the method
removeMethod.Invoke(dbSet, new[] { sewingCard });
}
}
Я пытался передать dbSet как IDbSet<dynamic>
, но это, похоже, не работает для меня.Я, вероятно, делал что-то не так.dbSet становится нулевым, когда я пытаюсь разыграть его.