2016-05-16 1 views
2

Извините, название этого вопроса не очень хорошее. Я не уверен, как сгустить предмет до одного предложения.Смешивание отношений один-ко-многим со многими-ко-многим

Вот что мы начнем с довольно простой настройки. Органы к налогам - один ко многим.

class DataContext : DbContext 
{ 
    public DbSet<Org> Orgs { get; set; } 
    public DbSet<Tax> Taxes { get; set; } 
} 

class Org 
{ 
    public int Id { get; set; } 

    private List<Tax> taxes; 
    public virtual List<Tax> Taxes 
    { 
     get { return taxes ?? (taxes = new List<Tax>()); } 
     protected set { taxes = value; } 
    } 
} 

class Tax 
{ 
    public int Id { get; set; } 

    public int OrgId { get; set; } 
    public virtual Org Org { get; set; } 
} 

Это приводит следующую схему, как и ожидалось:

Before

Теперь я хотел бы добавить DefaultTaxId к Оргам.

class Org 
{ 
    public int Id { get; set; } 

    private List<Tax> taxes; 
    public virtual List<Tax> Taxes 
    { 
     get { return taxes ?? (taxes = new List<Tax>()); } 
     protected set { taxes = value; } 
    } 

    // default tax added here 

    public int? DefaultTaxId { get; set; } 
    public virtual Tax DefaultTax { get; set; } 
} 

Однако, когда я генерировать миграции, то в C# выглядит следующим образом:

public override void Up() 
{ 
    DropForeignKey("dbo.Taxes", "OrgId", "dbo.Orgs"); 
    AddColumn("dbo.Orgs", "DefaultTaxId", c => c.Int()); 
    AddColumn("dbo.Taxes", "Org_Id", c => c.Int()); 
    CreateIndex("dbo.Orgs", "DefaultTaxId"); 
    CreateIndex("dbo.Taxes", "Org_Id"); 
    AddForeignKey("dbo.Orgs", "DefaultTaxId", "dbo.Taxes", "Id"); 
    AddForeignKey("dbo.Taxes", "Org_Id", "dbo.Orgs", "Id"); 
} 

И схема выглядит следующим образом:

After

DefaultTaxId колонок был добавлен к Оргам как и ожидалось, однако таблица налогов теперь имеет столбец Org_Id с внешним ключом, а исходный столбец OrgId - n o более длинный внешний ключ.

Почему эти дополнительные операции и изменения схемы происходят? Я думаю, потому что у Org есть налог, а у налога есть Org, EF думает, что я пытаюсь смешивать один-ко-многим со многими-ко-многим, но я не знаю, как это исправить.

Как я могу добавить внешний ключ DefaultTaxId к Orgs?

ответ

0

EF больше не может устанавливать отношения. Вы можете сделать это с беглым кодом или здесь будет аннотация необходима:

class Tax 
{ 
    public int Id { get; set; } 

    [ForeignKey("Org")] 
    public int OrgId { get; set; } 

    [InverseProperty("Taxes")] 
    public virtual Org Org { get; set; } 
} 

https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449317867/ch04s03.html

0

Конфигурация Fluent, чтобы сделать это было бы:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Org>().HasMany(o => o.Taxes).WithRequired(t => t.Org); 
    modelBuilder.Entity<Org>().HasOptional(o => o.DefaultTax).WithRequired(); 
}