我正在尝试动态构建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];