C# 如何判断对象是否是实体模型的一部分?
基本上,我正试图找到一种不那么可怕的方法:C# 如何判断对象是否是实体模型的一部分?,c#,entity-framework,C#,Entity Framework,基本上,我正试图找到一种不那么可怕的方法: foreach (var k in someList) { try { var temp = Database.Set(k.GetType()).Local; newList.Add(k); } catch (InvalidOperationException) { } } Database是我的模型的DbContext实例 someList是对象的集合,一些是实体模型
foreach (var k in someList)
{
try
{
var temp = Database.Set(k.GetType()).Local;
newList.Add(k);
}
catch (InvalidOperationException)
{
}
}
Database
是我的模型的DbContext
实例
someList
是对象的集合,一些是实体模型的一部分,其他不是。我想创建一个新列表(newList
),其中只包含作为模型一部分的对象。someList
中的对象可以是任何类型(在我的例子中,其中之一是List
,它显然与我的底层数据库无关)
当来自
someList
的对象不是实体模型的一部分时,会引发InvalidOperationException
。通过这样做,我得到了我想要的,但这似乎是一个黑客。我正在寻找一个更好的解决方案。这似乎不是一个直接的答案,但与其尝试使用DBContext
实例进行检查,不如使用一个标记接口。然后您可以直接检查,而无需使用DBContext
。比如说,
public interface IEntity
{
}
public clas SomeEntity : IEntity
{
... some properties
}
另外,作为旁注,我想知道您如何能够在同一个列表中存储不同类型的实例。我添加了这个答案,以便找到这个问题的任何人都可以看到我是如何解决的。尽管如此,真正的解决办法是避免实体和非实体在同一个集合中(如对原始问题的评论中所述) 要过滤集合
someList
,您需要知道哪些类型是实体,哪些不是实体。为此,我根据我的DbContext
的属性构造了一个类型列表
types = (from t in typeof (Entities).GetProperties()
where t.PropertyType.IsGenericType
where
t.PropertyType.GetGenericTypeDefinition() ==
typeof (DbSet<object>).GetGenericTypeDefinition()
select t.PropertyType.GetGenericArguments()[0]).Distinct();
types=(来自typeof(Entities.GetProperties()中的t)
其中t.PropertyType.IsGenericType
哪里
t、 PropertyType.GetGenericTypeDefinition()==
typeof(DbSet).GetGenericTypeDefinition()
选择t.PropertyType.GetGenericArguments()[0]).Distinct();
Entities
是表示我的数据库模型的类(它继承自DbContext
)
这是通过在实体中定位所有DbSet
属性,然后构建所有T
类型的集合来实现的。每种类型都代表一种实体类型
要筛选someList
我只需检查每个成员的类型是否包含在集合types
someList
和k
的类型是什么?someList
可以包含任何类型吗?方法Database.Set(k)
不存在。你是说Database.Set(k.GetType())
?可能给出一个具体类型的示例。someList可以包含任何类型。对不起,是的,那是个打字错误。我会稍微修改一下这个问题。真正的问题是你有一个someList
包含实体和非实体。一个好的解决办法可以避免这种情况。@Henkholtman我很感激,从更大的角度来看,我认为你是正确的。然而,这对我现在并没有什么帮助。是的,我认为你们是对的,我将对此进行调查。我承认,如果我的问题没有简单的解决办法,我会有点难过。如果能够以这种方式很好地按类型过滤对象,那就太好了。我已经考虑过类似的事情了,因为我的大多数实体类上碰巧都有一个接口。明显的问题是所需的维护。必须确保所有相关对象都具有此接口。不理想,但方向正确。