如何判断对象是否是实体模型的一部分?

时间:2013-02-06 08:36:29

标签: c# entity-framework

基本上我正试图找到一种不那么糟糕的方法来做到这一点:

foreach (var k in someList)
{
    try
    {
        var temp = Database.Set(k.GetType()).Local;
        newList.Add(k);
    }
    catch (InvalidOperationException)
    {

    }
}

Database是我的模型的DbContext个实例。

someList是对象的集合,有些是实体模型的一部分,有些则不是。我想创建一个新列表(newList),它只包含作为模型一部分的对象。 someList中的对象可以是任何类型(在我的情况下,其中一个是List<string>,这显然与我的底层数据库无关。)

当来自InvalidOperationException的对象不是实体模型的一部分时,会引发someList。通过这样做我得到我想要的东西,但它似乎是一个黑客。我正在寻找更好的解决方案。

2 个答案:

答案 0 :(得分:1)

这似乎不是直接的答案,但您可以只使用Marker界面,而不是尝试使用DBContext实例进行检查。然后,您可以直接查看,而无需使用DBContext。例如,

public interface IEntity
{
}

public clas SomeEntity : IEntity
{
    ... some properties
}

另外,作为旁注,我想知道如何在同一个List中存储不同类型的实例。

答案 1 :(得分:0)

我正在添加此答案,以便找到此问题的任何人都能看到我是如何解决它的。话虽如此,真正的解决方案是避免在同一集合中使用实体和非实体(如对原始问题的评论中所述)。

要过滤集合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();

Entities是表示我的数据库模型的类(它继承自DbContext)。

这可以通过在DbSet<T>中找到所有Entities属性,然后构建所有T类型的集合来实现。这些类型中的每一种都代表一种实体类型。

要过滤someList,我只需检查每个成员的类型是否包含在集合types中。