【问题标题】:Mixing one-to-many with many-to-many relationships混合一对多和多对多关系
【发布时间】:2016-05-16 01:10:40
【问题描述】:

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

这是我们开始的,非常简单的设置。 Orgs to Taxes 是一对多的。

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; }
}

这会按预期生成以下架构:

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

为什么会发生这些额外的操作和架构更改? 我认为因为 Org 有 Tax 并且 Tax 有 Org,所以 EF 认为我正在尝试将一对多与多对多混合,但我不知道如何解决它。

如何向 Orgs 添加 DefaultTaxId 外键?

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      执行此操作的流畅配置是:

      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();
      }
      

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2012-06-14
        • 2020-07-12
        • 2015-07-05
        • 1970-01-01
        • 2015-02-05
        相关资源
        最近更新 更多