【问题标题】:In Code first The INSERT statement conflicted with the FOREIGN KEY constraintIn Code first INSERT 语句与 FOREIGN KEY 约束冲突
【发布时间】:2013-03-03 13:09:25
【问题描述】:

我刚刚开始使用代码优先方法来创建数据库。我有以下 3 个表:

public partial class AccountHolder
{
    public int AccountHolderId { get; set; }

    public virtual List<Address> Address { get; set; }
}

public partial class Nominee
{
    public int NomineeId { get; set; }

    public virtual List<Address> Address { get; set; }
}

public partial class Address
{
    public int AddressId { get; set; }

    public int AccountHolderId { get; set; }
    public AccountHolder AccountHolder { get; set; }

    public int NomineeId { get; set; }
    public Nominee Nominee { get; set; }
}

这里AccountHolderNominee 都与地址有1 to * 关系。我用于此的 fluent API 代码是:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Address>().HasRequired(p => p.AccountHolder)
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.AccountHolderId)
                                      .WillCascadeOnDelete(false);
        modelBuilder.Entity<Address>().HasRequired(p => p.Nominee) 
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.NomineeId)
                                      .WillCascadeOnDelete(false);
    }

现在我的问题是,每当我尝试在 AccountHolder 或 Nominee 中插入数据时,我都会遇到此异常:

在 AccountHolder 插入的情况下

{"INSERT 语句与 FOREIGN KEY 约束 \"FK_dbo.Addresses_dbo.Nominees_NomineeId\" 冲突。冲突发生在数据库 \"CodeFirst.BankContext\",表 \"dbo.Nominees\",列 'NomineeId' .\r\n语句已终止。"}

如果插入被提名人

{"INSERT 语句与 FOREIGN KEY 约束 \"FK_dbo.Addresses_dbo.AccountHolders_AccountHolderId\" 冲突。冲突发生在数据库 \"CodeFirst.BankContext\",表 \"dbo.AccountHolders\",列 'AccountHolderId' .\r\n语句已终止。"}

谁能告诉我如何解决这个问题以及我在这里缺少什么?

【问题讨论】:

    标签: c# sql database code-first


    【解决方案1】:

    您尝试插入 Nominee 中不存在的地址 Nominees_NomineeId。您应该首先创建 Nominee 实例然后填充值并创建地址并填充值最后创建 AccountHolder 实例。然后保存

    【讨论】:

    • 感谢您的回答,它有效。但是现在每当我要插入被提名人或账户持有人时,我必须在插入账户持有人的情况下为被提名人创建一个空对象,在插入被提名人的情况下为账户持有人创建一个空对象,有什么方法可以为两者设置默认值这些导航属性?
    • 我认为你应该插入值然后使用它,例如你必须在表中插入值然后使用它。
    • 好的,但出于好奇,为两者设置默认值有什么问题?
    • 例如,我有两个表管理器和人员。每个管理器都是一个人,因此您希望在管理器中插入人员 id 为 1 但具有 1 id 的人员不存在并出现错误
    【解决方案2】:

    在您的表 dbo.AccountHolders 和 dbo.Nominees 中,它具有对另一个表的外键引用。 FK 的工作方式是它在该列中的值不能不在被引用表的主键列中。

    如果您有 SQL Server Management Studio,请将其打开并使用 sp_help 'dbo.dbo.Nominees'。查看 FK 在哪一列,以及它引用了哪个表的哪一列。您正在插入一些错误数据。对 sp_help 'dbo.dbo.AccountHolders '执行相同操作。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2021-05-30
      相关资源
      最近更新 更多