【问题标题】:Entity Framework 4.1 Dynamically retrieve mapped column nameEntity Framework 4.1 动态检索映射列名
【发布时间】:2011-09-05 20:15:01
【问题描述】:

我正在尝试动态构造一条 SQL 语句。

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

我的 EntityTypeConfiguration 类指定 HasColumnName 将 Entity 属性名称映射到 db 表列名称,我需要用它来构造我的 SQL 语句。

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

根据我的研究,我似乎可以通过 MetadataWorkspace 访问这些信息,而我可以通过 ObjectContext 访问这些信息。

我已经设法使用 MetadataWorkspace.GetItem("MyDomain.TestEntity",DataSpace.OSpace) 检索了我感兴趣的实体,这使我可以访问属性,但是属性的任何属性都没有给我映射的 db 列的名称,由 HasColumnName 指定。

我也不清楚 DataSpace.OSpace 是什么以及为什么我的模型是在这个空间中构建的。

如果有人能对此有所了解,我将不胜感激

更新

进一步了解@Ladislav 的 cmets。我发现我可以得到如下信息 对于类属性

ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members

表格属性

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

因此,鉴于我只知道类型 MyDomain.TestEntity 和 Memeber“名称”。我将如何获得“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];

【问题讨论】:

  • ClrEntityType 在 System.Data.Entity 内部。你怎么打这个电话?反射?

标签: entity metadata entity-framework-4.1


【解决方案1】:

MetadataWorkspace 包含DataSpace 指定的多个容器。你感兴趣的是:

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

【讨论】:

  • 谢谢。我没有在您指出的确切位置找到解决方案,但它让我在其他 DataSpaces 中寻找,我现在离解决这个问题更近了一点。如果可能的话,请您看看我的更新并进一步澄清
猜你喜欢
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多