c# - Entity Framework Code First Many to Many relationship(s) in single table -
i've been lurking around quite time, here's first question ;)
i've been playing entity framework 5.0 code first , want following:
i have 2 entities , want every entity have relation address entity in following way:
- i have 1 address entity stores address values, doesn't have relation entities has values, instead
- there's entity addressbook has reference address entity , coresponding entities (person, company, others in future)
here's code:
public partial class address : baseentity { [key] public int id { get; set; } public string street { get; set; } public string cityname { get; set; } public int? postalcode { get; set; } public virtual icollection<person> persons { get; set; } public virtual icollection<company> companies{ get; set; } } public partial class person : baseentity { [key] public int id { get; set; } public virtual icollection<address> addresses { get; set; } } public partial class company: baseentity { [key] public int id { get; set; } public virtual icollection<address> addresses { get; set; } } what create database schema tables:
- address
- addressperson (with composite primary key)
- address_id
- person_id
- addresscompany
- address_id
- company_id
- people
- companies
here's want do:
- address
- addressbook
- address_id (pk)
- person_id (fk)
- company_id (fk)
- people
- companies
what want have table addressbook:
public partial class addressbook { [key] public int id { get; set; } public virtual address address { get; set; } public virtual person person { get; set; } public virtual company company { get; set; } } i'm not sure how define navigational properties in person , company class.
they should have icollection<address> addresses navigational property, because want them work collection of addresses without knowing underlying addressbook.
is possible dbmodelbuilder or should write code inside getter , setter of icollection<address> addresses property , addresses addressbook?
thanks!
you cannot create mapping in way entity framework understand addresses collections in person , company true navigation properties (which support eager , lazy loading , on). need indeed addressbooks collections. can add addresses not mapped , readonly helper properties then:
public partial class person : baseentity { [key] public int id { get; set; } public virtual icollection<addressbook> addressbookentries { get; set; } public ienumerable<address> addresses { { return addressbookentries.select(ab => ab.address); } } } (the same company.)
an alternative , in opinion better approach create common base class person , company, move addresses collection base class , have single many-to-many relationship , single join table between base class , address:
public abstract class entitywithaddresses : baseentity { [key] public int id { get; set; } public virtual icollection<address> addresses { get; set; } } public partial class person : entitywithaddresses { } public partial class company : entitywithaddresses { } address has navigation collection new base class:
public partial class address : baseentity { [key] public int id { get; set; } public string street { get; set; } public string cityname { get; set; } public int? postalcode { get; set; } public virtual icollection<entitywithaddresses> entitywithaddresses { get; set; } }
Comments
Post a Comment