Plymorphic отношения многие ко многим в EF - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть полиморфная коллекция для одного типа сущности, которая содержит коллекцию объектов, являющихся ее дочерними типами.все дочерние типы хранятся в разных таблицах в БД.

Мне нужно отобразить эту взаимосвязь в свободный API, чтобы я мог управлять каскадами.Вот пример структуры сущности, которая у меня есть ...

[Table("Reports", "Reporting")]
class Report
{
    [Key]
    public int Id { get; set; } 
    public virtual ICollection<Entry> Entries { get; set; }
}

abstract class Entry
{
   [Key]
   public int Id {  get; set; }
   public virtual ICollection<Report> Reports { get; set; }
}

[Table("InvoiceEntries", "Reporting")]
class InvoiceEntry : Entry
{
    public ICollection<Invoice> Invoices { get; set; }
}

... <other types> like InvoiceEntry each mapped to their own tables ...

В конфигурации моей модели у меня есть ...

builder.Ignore<Entry>();

Обновление

Как уже упоминалось в комментариях, здесь есть отличный ответ о полиморфных отношениях ...

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

... Мой сценарий - «Таблица на конкретный тип» сОтношение «многие ко многим» как полиморфное.

Хотя это описание великолепно, похоже, оно не охватывает этот сценарий

1 Ответ

0 голосов
/ 25 февраля 2019

Да ... хорошо, это было странно ... так что получается, что на самом деле это работает, только если вы достаточно хороши, чтобы сообщить, когда у вас есть производный тип от дочернего базового типа, который не работаетway.

Пример ...

[Table("Reports", "Reporting")]
class Report
{
    [Key]
    public int Id { get; set; } 
    public virtual ICollection<Entry> Entries { get; set; }
}

abstract class Entry
{
   [Key]
   public int Id {  get; set; }
   public virtual ICollection<Report> Reports { get; set; }
}

[Table("InvoiceEntries", "Reporting")]
class InvoiceEntry : Entry
{
    public ICollection<Invoice> Invoices { get; set; }
}

class PaymentEntry
{
   [ForeignKey("Payment")]
   public int PaymentId { get;set; }

   public virtual Payment Payment { get; set; }
}

Оказывается, проблема заключается в том, что объект отчета должен иметь подтип PaymentEntry, отображаемый с использованием Fluent API, и каскад отключается вЧтобы предотвратить множественные каскадные пути.

Если все дочерние типы имеют только стиль InvoiceEntry, то сопоставление EF «многие ко многим» может выяснить это само.избегайте каскадной проблемы или включайте все дочерние типы во многие-многие отношения.

...