获取实体框架中属性的映射列名称

Joh*_*ith 9 c# sql entity-framework

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

   public class Person
    {
        [Key]
        public int Id { get; set; }

        public string Name { get; set; }

        public virtual ICollection<PersonRight> PersonRights { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

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

        public string Name { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

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

人员实体的表格:

dbo.People with columns Id, Name
Run Code Online (Sandbox Code Playgroud)

PersonRights实体的表

dbo.PersonRights with columns Id, Name, Person_Id
Run Code Online (Sandbox Code Playgroud)

当我从数据库加载一个人时,它没有填充PersonRights属性,因为虚拟关键字使得延迟加载功能变得很好 - 而且没关系.

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

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

FK_dbo.PersonRights_dbo.People_Person_Id
Run Code Online (Sandbox Code Playgroud)

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

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

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

非常感谢你的回答 :)

编辑:

我发现列名称属性在这里:

  var items = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace.GetItems(DataSpace.CSSpace);
Run Code Online (Sandbox Code Playgroud)

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

如何访问System.Data.Entity.Core.Mapping.StorageEntityContainerMapping项目也是我需要的集合,以获取名为 - AssociationSetMappings?? 的列

dud*_*er4 17

您可以从存储模型中获取实际字符串"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 );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章帮助了我:https://romiller.com/2015/08/05/ef6-1-get-mapping-between-properties-and-columns/ (4认同)
  • @ john-smith如果你把这个`item.MetadataProperties ["PreferredName"].Value`放在迭代属性的循环中,你将在EF实体中获得相应的属性Name.我迟到了这个评论,因为我需要找到Poco中列和属性之间的映射,这篇文章对我有所帮助 (3认同)
  • 谢谢,有没有办法如何获得这些列和实际实体之间的关系?我仍然需要找出哪个列是Person实体的外键... (2认同)