获取entity framework中属性的映射列名称

在我的项目中,我使用Entity Framework 6.我有这些实体:

public class Person { [Key] public int Id { get; set; } public string Name { get; set; } public virtual ICollection PersonRights { get; set; } } 

  public class PersonRight { [Key] public int Id { get; set; } public string Name { get; set; } } 

当我插入一个填充了PersonRights的person对象时,它在数据库中看起来像这样:

人员实体的表格:

 dbo.People with columns Id, Name 

PersonRights实体的表

 dbo.PersonRights with columns Id, Name, Person_Id 

当我从数据库加载一个人时,它没有填充PersonRights属性,因为虚拟关键字使得延迟加载function变得很好 – 而且还可以。

然后我得到person对象的PersonRights,它也可以正常工作。

问题是,由于PersonRight实体中没有导航属性,因此entity framework必须知道数据库中哪些列是有界的两个属性。 在数据库中,ther是连接PersonRights和People表的外键:

 FK_dbo.PersonRights_dbo.People_Person_Id 

问题是:有没有办法获得列名这两个属性连接的列名? 如何在代码中获取字符串“Person_Id”?

有一种方法可以找出哪个表是数据库中的实体:

http://www.codeproject.com/Articles/350135/Entity-Framework-Get-mapped-table-name-from-an-ent

非常感谢你的回答 :)

编辑:

好吧,我发现列名称propety在这里:

  var items = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace.GetItems(DataSpace.CSSpace); 

但是我仍然无法达到它,问题很奇怪,当我从这个集合中得到第一个项目时它告诉我它的类型是System.Data.Entity.Core.Mapping.StorageEntityContainerMapping但是当我通过foreach突然通过它时类型是System.Data.Entity.Metadata.Edm.GlobalItem

我如何访问System.Data.Entity.Core.Mapping.StorageEntityContainerMapping项目,其中也是我需要获取列名称的集合–AnocSetMappings ??

您可以从存储模型中获取实际字符串“Person_Id”,但无法将该属性/列标识为外键。 为此,您需要Person_Id存在于概念模型中。 我仍然不太明白为什么你不想在模型中使用它,但是这里你将如何从存储元数据中获取它:

 using ( var context = new YourEntities() ) { 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 s as EntityType ); var personRightStorageMetadata = ( from m in entityProps where m.Name == "PersonRight" select m ).Single(); foreach ( var item in personRightStorageMetadata.Properties ) { Console.WriteLine( item.Name ); } }