当我从数据库中检索实体时,我正在使用包含“父属性”的动态方式。但是,由于检查属性是值类型(或字符串)还是某些东西(不包括那些),它还将包括定义为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:是的,我知道如果我没有父母属性,这将会失败......
答案 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());
关键是在GetEntityContainer
和GetEntitySetByName
中提供正确的名称,它也是代码优先和db / model之间的主要区别。如果您首先使用代码,则这些名称遵循一些约定。如果您使用EDMX,您可以在设计器中控制这些名称。
无论如何,这种自动包含是你应该避免使用的东西。仅包含您真正需要的数据并明确地执行此操作以始终显示complexity of the query。