在Code中,INSERT语句与FOREIGN KEY约束冲突

时间:2013-03-03 13:09:25

标签: c# sql database code-first

我刚开始使用Code first方法来创建数据库。我有以下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 \“。冲突发生在database \”CodeFirst.BankContext \“,table \”dbo.Nominees \“,列'NomineeId' 。\ r \ n声明已经终止。“}

如果是被提名者插入

  

{“INSERT语句与FOREIGN KEY约束冲突\”FK_dbo.Addresses_dbo.AccountHolders_AccountHolderId \“。冲突发生在database \”CodeFirst.BankContext \“,table \”dbo.AccountHolders \“,列'AccountHolderId' 。\ r \ n声明已经终止。“}

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

如果您有SQL Server Management Studio,请将其打开并sp_help'dbo.dbo.Nominees'。查看FK所在的列以及它引用的表的哪一列。您正在插入一些不良数据。对于sp_help'dbo.dbo.AccountHolders'也是如此。

希望这会有所帮助。