我有一个EntityFramework模型,其属性Prop
映射到表格中的字段PropField
。我想在运行时找到字段的名称(PropField
)。
我按照this answer中的建议,收到了EntityType
的清单。其中一个确实是Prop
,但它只包含属性的名称,而不是数据库中的字段名称。
我访问了DataSpace.CSpace
元数据,并收到了数据库字段列表。确实存在PropField
,但PropField
和Field
之间没有任何关联。使用DataSpace.CSSpace
并没有返回任何有意义的内容。
如何找到字段的名称?
答案 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()
});