查找属性的数据库字段名称

时间:2014-07-01 12:17:26

标签: .net entity-framework

我有一个EntityFramework模型,其属性Prop映射到表格中的字段PropField。我想在运行时找到字段的名称(PropField)。

我按照this answer中的建议,收到了EntityType的清单。其中一个确实是Prop,但它只包含属性的名称,而不是数据库中的字段名称。

我访问了DataSpace.CSpace元数据,并收到了数据库字段列表。确实存在PropField,但PropFieldField之间没有任何关联。使用DataSpace.CSSpace并没有返回任何有意义的内容。

如何找到字段的名称?

1 个答案:

答案 0 :(得分:0)

在这个答案的基础上,我想出了这个非常讨厌的反射解决方案 - 字段显然在那里,但我找不到任何合法的方式来访问它们。我只是将它用于单元测试,所以如果它破坏就没什么大不了的。

    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    var storageMetadata = ((EntityConnection)objectContext.Connection).GetMetadataWorkspace().GetItems(DataSpace.SSpace);
    var entityProps = (from s in storageMetadata where s.BuiltInTypeKind == BuiltInTypeKind.EntityType select (System.Data.Entity.Core.Metadata.Edm.EntityType)s);
    var entityName = "OrderItem";
    var entityStorageMetadata = (from m in entityProps where m.Name == entityName select m).Single();
    var pi = typeof(System.Data.Entity.Core.Metadata.Edm.EntityType).GetProperty("ForeignKeyBuilders", BindingFlags.NonPublic | BindingFlags.Instance);
    var fkBuilders = (IEnumerable<object>)pi.GetValue(entityStorageMetadata);
    Type builderType = fkBuilders.First().GetType();
    var builderProps = builderType.GetProperties();

    var fullPropsToColumns = fkBuilders.Select(x => new
    {
        PropertyName = builderProps.First(p => p.Name == "Name").GetValue(x).ToString().Split('_')[1],
        FieldName = ((IEnumerable<object>)builderProps.First(p => p.Name == "DependentColumns").GetValue(x)).First().ToString()
    });