3

我刚开始使用代码优先方法来创建数据库。我有以下 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 *与地址有关系。我用于此的流畅 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语句已终止。"}

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

4

2 回答 2

4

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

于 2013-03-03T13:14:28.253 回答
1

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

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

希望这可以帮助。

于 2013-03-03T13:18:17.580 回答