System.Data.Metadata.Edm.EntityType的EF4.0错误的命名空间

时间:2013-09-18 10:04:43

标签: c# .net entity-framework orm entity-framework-4

我在EF4代码中遇到一点问题(我认为这可能只是一个问题,实际上只使用CF)。

我正在尝试使用类似于此的代码从我的上下文元数据中获取实体类型的一些信息:

return (context as System.Data.Entity.Infrastructure.IObjectContextAdapter)
            .ObjectContext.MetadataWorkspace
            .GetItems<EntityType>(DataSpace.CSpace)
            .Where(x => x.FullName == ModelType.FullName)
            .FirstOrDefault();

ModelType是一个参数,它包含要搜索的实体的System.Type。 它应该返回带有类型元数据的System.Data.Metadata.Edm.EntityType实例。

DbSet中引用的模型名为MyApp.Models.User,DbContext类是在MyApp.Servicing命名空间下创建的

现在我遇到的问题是System.Data.Metadata.Edm.EntityType的FullName属性是 MyApp.Servicing .User(O_O)而不是MyApp.Models.User。

我认为可能是EF正在嘲笑edm Metadata,因为我没有代码优先的EDMX,但这只是猜测。

知道为什么会这样吗?我可以用另一种方式解决,但想知道原因。

1 个答案:

答案 0 :(得分:4)

你使用了错误的空间。 CSpace是顶级层。如果您正在使用“DataSpace.OSpace”,您将获得您正在寻找的完整限定类名。

   var OSpaceEntityType= (context as System.Data.Entity.Infrastructure.IObjectContextAdapter)
     .ObjectContext.MetadataWorkspace
     .GetItems<EntityType>(DataSpace.OSpace)
     .FirstOrDefault(x => x.FullName == ModelType.FullName);

...然后从CSpace商店获取相应的EntityType:

   var CSpaceEntityType= (context as System.Data.Entity.Infrastructure.IObjectContextAdapter)
     .ObjectContext.MetadataWorkspace
     .GetItems<EntityType>(DataSpace.CSpace)
     .FirstOrDefault(e => e.Name == OSpaceEntityType.Name);