Извините, название этого вопроса не очень хорошее. Я не уверен, как сгустить предмет до одного предложения.Смешивание отношений один-ко-многим со многими-ко-многим
Вот что мы начнем с довольно простой настройки. Органы к налогам - один ко многим.
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; }
}
Это приводит следующую схему, как и ожидалось:
Теперь я хотел бы добавить 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");
}
И схема выглядит следующим образом:
DefaultTaxId
колонок был добавлен к Оргам как и ожидалось, однако таблица налогов теперь имеет столбец Org_Id
с внешним ключом, а исходный столбец OrgId
- n o более длинный внешний ключ.
Почему эти дополнительные операции и изменения схемы происходят? Я думаю, потому что у Org есть налог, а у налога есть Org, EF думает, что я пытаюсь смешивать один-ко-многим со многими-ко-многим, но я не знаю, как это исправить.
Как я могу добавить внешний ключ DefaultTaxId к Orgs?