Я скитался довольно долго, так что вот первый вопрос;)

Я играл с 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
dpihac 24 Мар 2013 в 18:42

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; }
}
0
Slauma 24 Мар 2013 в 19:37
Спасибо за помощь - я пришел к выводу, что мне нужно сделать что-то вроде первого примера. Я даже закодировал часть решения, но мне это не совсем понравилось. Я подумал, что должен быть способ получше.
 – 
dpihac
24 Мар 2013 в 20:57