Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
201 views
in Technique[技术] by (71.8m points)

c# - Getting mapped column names of properties in entity framework

in my project I use Entity Framework 6. I have these entities:

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

        public string Name { get; set; }

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

and

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

        public string Name { get; set; }
    }

When I insert a person object with filled in PersonRights it looks like this in the database:

table for Person entity:

dbo.People with columns Id, Name

table for PersonRights entity

dbo.PersonRights with columns Id, Name, Person_Id

when I load a person from a database it hasnt filled PersonRights property because of the virtual keyword which is enabeling the lazy loading feature - and its okay.

Then I get the PersonRights for the person object and it also works fine.

The thing is, since there is no navigation property in PersonRight entity, the entity framework must know by which columns in the database are those two properties bounded. In database ther is a foreign key connecting PersonRights and People tables:

FK_dbo.PersonRights_dbo.People_Person_Id

The question is : Is there any way how to get the column name by which are those two properties connected? Any way how to get the string "Person_Id" in code?

There is a way how to find out to which table is an entity bounded in database :

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

thanks a lot for your answers :)

EDIT:

Well I found out that the column name propety is here:

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

but I still cant reach it, the problem is weird, when I get first item from this collection it shows me that its type is System.Data.Entity.Core.Mapping.StorageEntityContainerMapping but when I go through it by foreach suddenly the type is System.Data.Entity.Metadata.Edm.GlobalItem ...

How can I access the System.Data.Entity.Core.Mapping.StorageEntityContainerMapping item where is also the collection I need to get the column named - AssociationSetMappings ??

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can get to the actual string "Person_Id" from the storage model, but you cannot identify that property/column as the foreign key. For that you would need Person_Id to exist in the conceptual model. I still don't quite understand why you wouldn't want it in the model, but here's how you would get it from the storage metadata:

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 );
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...