gpt4 book ai didi

c# - 在 Entity Framework 中获取属性的映射列名称

转载 作者:太空狗 更新时间:2023-10-29 17:37:57 26 4
gpt4 key购买 nike

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

   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 的人对象时,它在数据库中看起来像这样:

Person 实体表:

dbo.People with columns Id, Name

PersonRights 实体表

dbo.PersonRights with columns Id, Name, Person_Id

当我从数据库加载一个人时,它没有填充 PersonRights 属性,因为 virtual 关键字启用了延迟加载功能 - 没关系。

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

问题是,由于 PersonRight 实体中没有导航属性, Entity Framework 必须知道数据库中的哪些列是这两个属性的边界。在数据库中有一个连接 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

非常感谢您的回答:)

编辑:

好吧,我发现列名属性在这里:

  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 的列的集合?

最佳答案

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

关于c# - 在 Entity Framework 中获取属性的映射列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20161854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com