将一对多与多对多关系混合

时间:2016-05-16 01:10:41

标签: c# entity-framework ef-code-first ef-migrations

抱歉,这个问题的标题不是很好。我不知道如何将这个主题简化为一句话。

这是我们开始的,非常简单的设置。税收的组织是一对多的。

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添加到Orgs。

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列已按预期添加到Orgs,但Taxes表现在有一个带有外键的Org_Id列,原始OrgId列不再是外键

为什么会发生这些额外的操作和架构更改? 我认为因为Org有税和税有组织,EF认为我试图将一对多与多对多混合,但我不知道如何解决它。

如何向Orgs添加DefaultTaxId外键?

2 个答案:

答案 0 :(得分:0)

EF无法再确定关系。您可以使用流畅的代码来完成,或者这里需要注释:

attr

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

答案 1 :(得分: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();
}