我有这种方法可以从我的EF上下文中删除缝纫卡。基本上我有一个主要的SewingCard类,大约有15个来自SewingCard的类。所有这些类都有自己的DbSet。我希望此方法接受一个参数,该参数是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最终为null。 最佳答案
你不能做:
public void RemoveSewingCards(List<SewingCard> sewingCards, ApplicationDbContext context)
{
//iterating through sewingCards list
foreach (var sewingCard in sewingCards)
{
var sewingCardType = sewingCard.GetType();
var dbSet = context.Set(sewingCardType).Remove(sewingCard);
}
}
https://msdn.microsoft.com/en-us/library/gg679544(v=vs.113).aspx
关于c# - 在运行时标识派生类所属的dbset的更好方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52440561/