1

我在 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 元数据,因为我在代码优先中没有 EDMX,但这只是猜测。

知道为什么会发生这种情况吗?我可以用另一种方式解决它,但想知道为什么。

4

1 回答 1

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);
于 2013-09-19T23:30:36.783 回答