admin

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

sql

在我的项目中,我使用Entity Framework6。我有以下实体:

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

        public string Name { get; set; }

        public virtual ICollection<PersonRight> PersonRights { get; set; }
    }

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

        public string Name { get; set; }
    }

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

人员实体表:

dbo.People with columns Id, Name

PersonRights实体表

dbo.PersonRights with columns Id, Name, Person_Id

当我从数据库加载人时,它没有填充PersonRights属性,这是因为virtual关键字具有延迟加载功能-可以。

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

事实是,由于PersonRight实体中没有导航属性,因此该实体框架必须知道数据库中的这两个属性是由哪些列限制的。在数据库中,是连接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项目,在哪里我还需要获取名为-
AssociationSetMappings??的列的集合?


阅读 146

收藏
2021-05-10

共1个答案

admin

您可以从存储模型中获取实际的字符串“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 );
  }
}
2021-05-10