Entity Framework 4.1 动态检索映射的列名称

发布于 2024-11-10 14:38:54 字数 1498 浏览 4 评论 0原文

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

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

我的 EntityTypeConfiguration 类指定 HasColumnName 将实体属性名称映射到数据库表列名称,这是我构建 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 和 Memeber“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];

I am trying to construct an SQL statement dynamically.

My context is created dynamically, using reflection finding classes deriving from EntityTypeConfiguration and adding them to DbModelBuilder.Configuration.

My EntityTypeConfiguration classes specify HasColumnName to map the Entity property name to db table column name, which I need to construct my SQL statement.

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

From What I have researched, it seems I can get access to this information through MetadataWorkspace, which I can get to through ObjectContext.

I have managed to retrieve the the entity I am interested in with MetadataWorkspace.GetItem("MyDomain.TestEntity",DataSpace.OSpace), which gives me access to Properties, but none of the properties, of Properties, give me the name of the mapped db column, as specified with HasColumnName.

Also I am not clear what DataSpace.OSpace is and why my model is constructed in this space.

If Anyone can shed some light on this I would be grateful

UPDATE

Further to @Ladislav's comments. I discovered I can get the information as follows
For the class properties

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

For the table properties

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

So given that I only know the type MyDomain.TestEntity and Memeber "Name". How would I go about to get "dbName". Can I always assume that my mapped class will be created in CodeFirstDatabaseSchema, om order to dynamically construct the identity to retrieve it from SSpace and how would I get to the correct Member in SSpace. Can I do something like

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

够运 2024-11-17 14:38:54

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

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

MetadataWorkspace contanis several containers specified by DataSpace. Interesting for you are:

  • CSpace - description of conceptual model (this should contain properties)
  • CSSpace - mapping of conceptual model to storage model (this should contain how classes / properties are mapped to tables / columns)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文