实体框架4.1:动态检索映射的列名

5

我正在尝试动态构建SQL语句。

我的上下文是动态创建的,使用反射查找从EntityTypeConfiguration派生的类,并将它们添加到DbModelBuilder.Configuration中。

我的EntityTypeConfiguration类指定了HasColumnName来将实体属性名称映射到db表列名,这是我构建SQL语句所需要的。

namespace MyDomain {
    public class TestEntityConfig : EntityTypeConfiguration<TestEntity>{
        Property("Name").HasColumnName("dbName");
    } 
 }

根据我的研究,我似乎可以通过MetadataWorkspace获取此信息,而我可以通过ObjectContext获得它。
我已经成功地使用MetadataWorkspace.GetItem("MyDomain.TestEntity",DataSpace.OSpace)检索到了我感兴趣的实体,这使我可以访问Properties,但是,除了Properties中指定的HasColumnName之外,没有任何属性给我映射的数据库列的名称。
此外,我不清楚DataSpace.OSpace是什么以及为什么我的模型是在该空间中构建的。
如果有人能够解释一下,我将不胜感激。
更新:
根据@Ladislav的评论,我发现可以按以下方式获取信息:对于类属性
ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members

关于表格属性

ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members

假设我只知道类型为MyDomain.TestEntity和成员"Name",那么我该如何获取"dbName"?我能否总是假定我的映射类将在CodeFirstDatabaseSchema中创建,以便动态构造标识以从SSpace中检索它,并且我该如何找到SSpace中正确的成员?我能否像这样做:

var memIndex = ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members["Name"].Index;

var dbName = ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members[memIndex];

1
ClrEntityType 是 System.Data.Entity 内部的类。你是如何调用它的?使用反射吗? - jspaey
1个回答

0

MetadataWorkspace 包含由 DataSpace 指定的多个容器。对您来说感兴趣的是:

  • CSpace - 概念模型的描述(应包含属性)
  • CSSpace - 将概念模型映射到存储模型(应包含如何将类/属性映射到表/列)

谢谢。我没有在您指示的确切位置找到解决方案,但这让我开始查看其他DataSpaces,并且现在离解决问题更近了一步。如果可能的话,请查看我的更新并进一步澄清。 - ricardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接