【问题标题】:Entity Framework 4.3 POCO Include on Complex Types throws exceptionEntity Framework 4.3 POCO 包含在复杂类型上引发异常
【发布时间】:2012-02-15 17:33:43
【问题描述】:

当我从数据库中检索实体时,我正在使用包含“父属性”的动态方式。但是,由于这会检查属性是值类型(或字符串)还是某些东西的可枚举(不包括那些),所以它还将包括定义为复杂类型的实体。这将导致异常。

是否可以检查实体是否已定义为复杂类型?

请看这个示例代码:

public IEnumerable<object> LookupExtent(Type type)
{
        var set = Set(type);

        DbQuery q = null;

        foreach (var prop in type.GetParentProperties())
        {
            if (q == null)
                q = set.Include(prop.Name);
            else
                q = q.Include(prop.Name);
        }

        return q.ToObjectArray();
    }

PS:是的,我知道如果我没有父属性,这将失败......

【问题讨论】:

    标签: .net c#-4.0 entity-framework-4 complextype


    【解决方案1】:

    它有更多的问题。如果您的实体包含一些额外的未映射属性会发生什么?您可以要求 EF 为您提供所有映射导航属性的名称。从 EF 元数据中获取信息并不是什么科学,但这是可能的。尝试这样的事情(代码期望您使用 DbContext API,但它可以轻松更改为 ObjectContext API):

    ObjectContext objectContext = ((IObjectContextAdapter) dbContext).ObjectContext;
    MetadataWorkspace workspace = objectContext.MetadataWorkspace;
    EntityContainer container = 
        workspace.GetEntityContainer("NameOfYourContextClass", true, DataSpace.CSpace);
    EntitySet entitySet = 
        container.GetEntitySetByName("NameOfYourPropertyExposingDbSetOnTheContext", true);
    IEnumerable<string> navigationPropertyNames = 
        entitySet.ElementType.NavigationProperties.Select(n => n.ToString());
    

    关键是在GetEntityContainerGetEntitySetByName 中提供正确的名称,这也是代码优先和数据库/模型优先之间的主要区别。如果您首先使用代码,则这些名称遵循一些约定。如果您使用 EDMX,您可以在设计器中控制这些名称。

    无论如何,这个自动包含是你应该避免使用的东西。仅包含您真正需要的数据,并明确执行以始终显示complexity of the query

    【讨论】:

    • 我理解您的担忧,我想要实现的不是“默认用例”。我只会在非常特殊的情况下使用这个自动魔法。默认情况下不包括任何父属性或子属性,并且必须明确说明这些属性的加载。当我回到办公室(下周一)时,我会试试你的代码并将你的代码标记为答案,所以你必须稍等一下;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2011-10-05
    • 1970-01-01
    • 2015-11-21
    • 2012-12-08
    • 2016-06-19
    相关资源
    最近更新 更多