Я скитался довольно долго, так что вот первый вопрос;)
Я играл с Entity Framework 5.0 Code First, и я хочу сделать следующее:
У меня есть две сущности, и я хочу, чтобы каждая сущность имела отношение к сущности Address следующим образом:
- У меня есть один объект Address , в котором хранятся значения адресов, он не имеет отношения к объектам, для которых он имеет значения, вместо этого
- Есть еще один объект AddressBook , который ссылается на объект Address и соответствующие объекты ( Person , Company , некоторые другие в будущее)
Вот код:
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; }
}
Что это будет делать, так это создать схему базы данных с таблицами:
- Адрес
- AddressPerson (с составным первичным ключом)
- Address_ID
- Person_ID
- АдресКомпания
- Address_ID
- Company_ID
- люди
- Компании
Вот что я хочу сделать:
- Адрес
- Адресная книга
- Address_ID (PK)
- Person_ID (FK)
- Company_ID (FK)
- люди
- Компании
Я хочу иметь такую таблицу, как 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; }
}
Я не знаю, как определить свойства навигации в классах Person и Company .
У них должно быть свойство навигации ICollection<Address> Addresses
, потому что я хочу, чтобы они работали только со сбором адресов, не зная о базовой адресной книге .
Можно ли сделать это с помощью DbModelBuilder
или мне следует написать код внутри getter
и setter
свойства ICollection<Address> Addresses
и получить адреса из AddressBook ?
Благодарность!
1 ответ
Вы не можете создать сопоставление таким образом, чтобы Entity Framework понимала коллекции Addresses
в Person
и Company
как истинные свойства навигации (которые поддерживают активную и отложенную загрузку и т. Д.). Для этого вам действительно нужно AddressBooks
коллекций. Затем вы можете добавить Addresses
как вспомогательные свойства без отображения и только для чтения:
public partial class Person : BaseEntity
{
[Key]
public int ID { get; set; }
public virtual ICollection<AddressBook> AddressBookEntries { get; set; }
public IEnumerable<Address> Addresses
{
get { return AddressBookEntries.Select(ab => ab.Address); }
}
}
(То же самое с Company
.)
Альтернативным и, на мой взгляд, лучшим подходом было бы создание общего базового класса для Person
и Company
, перемещение коллекции Addresses
в этот базовый класс и создание единого типа "многие ко многим". взаимосвязь и таблица единого соединения между этим базовым классом и 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
имеет коллекцию навигации к новому базовому классу:
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; }
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.