如何判断一个对象是否属于实体模型?

3
基本上我正在尝试找到一种不那么糟糕的方法来完成这个任务:
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>,显然与我的底层数据库无关)。

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


1
someListk的类型是什么?someList可以包含任何类型吗?而且方法Database.Set(k)不存在。您是否意味着Database.Set(k.GetType())?也许可以给出具体类型的示例。 - Gert Arnold
someList 可以包含任何类型。对不起,是的,那是一个打字错误。我会稍微编辑一下问题。 - Siggi
4
真正的问题是你有一个包含实体和非实体的 someList。一个好的解决方案应该避免这种情况。 - H H
@HenkHolterman 我能理解你的观点,在更大的范围内,我认为你是正确的。然而,这并没有真正帮助我现在。 - Siggi
我和Henk一起去。我认为你应该在创建列表之前以及其中进行区分。在你的代码中必须有一个地方可以告诉对象的来源。那就是你应该启动想要对实体对象执行的任何操作的地方。 - Gert Arnold
1
是的,我认为你们是对的,我会去研究一下。我承认如果没有简单的解决方案,我会有点伤心。但如果可以用这种方式很好地按类型过滤对象,那还是很不错的。 - Siggi
2个回答

1

这可能不是一个直接的答案,但是你可以使用标记接口来检查,而不是尝试使用 DBContext 实例。然后你可以直接检查,而不使用 DBContext。例如,

public interface IEntity
{
}

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

此外,顺便提一下,我想知道您如何将不同类型的实例存储在同一个列表中。

我已经考虑过类似的事情,因为我的大多数实体类上都有一个接口。显然的问题是需要进行维护。必须确保所有相关对象都有这个接口。虽然不理想,但朝着正确的方向前进。 - Siggi

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)。

这是通过定位在 Entities 中所有的 DbSet<T> 属性,然后构建所有 T 类型的集合实现的。这些类型中的每一个都代表一个实体类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接