gpt4 book ai didi

c# - 在运行时识别派生类所属的数据库集的更好方法

转载 作者:行者123 更新时间:2023-12-02 13:42:02 25 4
gpt4 key购买 nike

我有这个方法可以从我的 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# - 在运行时识别派生类所属的数据库集的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com