实体框架4.3 POCO包含复杂类型会引发异常

时间:2012-02-15 17:33:44

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

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

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

请参阅此示例代码:

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:是的,我知道如果我没有父母属性,这将会失败......

1 个答案:

答案 0 :(得分: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中提供正确的名称,它也是代码优先和db / model之间的主要区别。如果您首先使用代码,则这些名称遵循一些约定。如果您使用EDMX,您可以在设计器中控制这些名称。

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