Nano Hash - криптовалюты, майнинг, программирование

Entity Framework Code Первые отношения «многие ко многим» в одной таблице

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

Я играл с Entity Framework 5.0 Code First и хочу сделать следующее:

У меня есть два объекта, и я хочу, чтобы каждый объект имел отношение к объекту Address следующим образом:

  • У меня есть один объект 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<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 (with composite primary key)
    • Address_ID
    • Person_ID
  • AddressCompany
    • Address_ID
    • Идентификатор компании
  • Люди
  • Компании

Вот что я хочу сделать:

  • Адрес
  • AddressBook
    • Address_ID (PK)
    • Person_ID (ФК)
    • Company_ID (ФК)
  • Люди
  • Компании

Я хочу иметь таблицу типа 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 навигационное свойство, потому что я хочу, чтобы они работали только с набором адресов, не зная о базовой AddressBook.

Можно ли сделать это с помощью 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; }
}
24.03.2013
  • Спасибо за помощь - я пришел к выводу, что я должен сделать что-то вроде первого примера. Я даже закодировал часть решения, но оно мне не совсем понравилось. Я думал, что должен быть лучший способ. 24.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..