2

Я моя модель домена У меня есть Company базового класс в который является абстрактным и три различным типом компании, представленным подклассами Компании:EF-Миграция FK ошибка при попытке создать отношения между подтипами

public abstract class Company 
{ 
    public int Id { get; set; } 
    ... 
} 

public class Supplier : Company 
{ 
    ... 
} 

public class Dealer : Company 
{ 
    public DealerFundsAccount FundsAccount { get; set; } 
    ... 
} 

public class Retailer : Company 
{ 
    public RetailerFundsAccount FundsAccount { get; set; } 
    ... 
} 

таким же образом, , у меня есть еще один базовый класс, который определяет фонды счета и два подтипа, которые реализуют специфические свойства:

public abstract class FundsAccount 
{ 
    public int Id { get; set; } 
    ... 
} 

public class DealerFundsAccount : FundsAccount 
{ 
    public Dealer Dealer { get; set; } 
    ... 
} 

public class RetailerFundsAccount : FundsAccount 
{ 
    public Retailer Retailer { get; set; } 
    ... 
} 

Моя стратегия отображения для этих типов таблица на иерархии, так что в моем классе DbContext я только определить DbSets для базовых классов, w Хич делает меня способным выполнять как полиморфные и не полиморфные запросы:

public DbSet<Company> Companies { get; set; } 
public DbSet<FundsAccount> FundsAccounts { get; set; } 

Сейчас идет сложная часть, мои требования заявить, что:

  • Поставщик должен не есть аккаунт средства
  • Дилер должен иметь дилерFundsAccount
  • Розничный торговец должен иметь розничный торговецФундсАккаунт

Это должно быть это просто:

modelBuilder.Entity<Retailer>() 
    .HasRequired(r => r.FundsAccount) 
    .WithRequiredDependent(rfa => rfa.Retailer); 

modelBuilder.Entity<Dealer>() 
    .HasRequired(d => d.FundsAccount) 
    .WithRequiredDependent(dfa => dfa.Retailer); 

Но EF Миграция терпит неудачу несчастно пытается обновить схему базы данных. Благодаря TPH, дилеры и розничные продавцы сопоставляются с одной и той же базой данных компании, в то время как RetailerFundsAccounts и DealerFundsAccounts сопоставляются с таблицей данных FundsAccount, все из которых желательны, но поскольку я определил две взаимно-однозначные отношения между подтипами, EF пытается для определения внешнего ключа в поле Ids FundsAccount дважды.

Я знаю, что я могу взломать решение, указав отношения «один ко многим» для каждой из таблиц Компании, у которых есть учетная запись средств, предотвращая поведение «один ко многим» с использованием уникальных ограничений в его FK, но я хотел уточните у вас, есть ли лучшее решение.

+0

Никто? Я начинаю думать, что это проблема миграции, я пытался реплицировать проблему в новом решении, и у меня не было ошибок. –

ответ

0

Оказывается, что виноваты EF-миграции. Если я пытаюсь создать схему базы данных с нуля, все хорошо, но если вы создаете миграцию, чтобы добавить эти объекты, EF терпит неудачу, пытаясь создать индекс и внешний ключ в два раза, как это:

 CreateTable(
      "dbo.FundsAccount", 
      c => new 
       { 
        Id = c.Int(nullable: false), 
        Discriminator = c.String(nullable: false, maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Company", t => t.Id) 
      .ForeignKey("dbo.Company", t => t.Id) // duplicate 
      .Index(t => t.Id) 
      .Index(t => t.Id); // duplicate 

решение заключается в редактировании миграции, удалении дублированных записей FK и индекса.

Я также уточню название вопроса, чтобы лучше описать проблему.

Смежные вопросы