gpt4 book ai didi

c# - 混合一对多和多对多关系

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:21 24 4
gpt4 key购买 nike

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

这是我们的开始,非常简单的设置。 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; }
}

如预期的那样,这会产生以下架构:

Before

现在我想向 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");
}

模式看起来像这样:

After

DefaultTaxId 列已按预期添加到 Orgs,但是 Taxes 表现在有一个带外键的 Org_Id 列,而原始 OrgId 列不再是外键。

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

我怎样才能将 DefaultTaxId 外键添加到 Orgs?

最佳答案

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

关于c# - 混合一对多和多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37245374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com