Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何判断对象是否是实体模型的一部分?_C#_Entity Framework - Fatal编程技术网

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我很感激,从更大的角度来看,我认为你是正确的。然而,这对我现在并没有什么帮助。是的,我认为你们是对的,我将对此进行调查。我承认,如果我的问题没有简单的解决办法,我会有点难过。如果能够以这种方式很好地按类型过滤对象,那就太好了。我已经考虑过类似的事情了,因为我的大多数实体类上碰巧都有一个接口。明显的问题是所需的维护。必须确保所有相关对象都具有此接口。不理想,但方向正确。