2013-03-03 139 views
3

我只是使用代码第一种方法,用于创建数据库开始。我有以下3个表:代码第一INSERT语句冲突与外键约束

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 * replationship与地址。我为此使用的流畅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); 
    } 

现在我的问题是,每当我试图在帐户持有人或代理人将数据插入我得到这个异常:

在账户持有插入的情况下

{ “INSERT语句冲突与外键约束\” FK_dbo.Addresses_dbo.Nominees_NomineeId \”。该冲突发生于数据库\ “CodeFirst.BankContext \”,表\ “dbo.Nominees \”,列“ NomineeId'。\ r \ n声明有蜜蜂Ñ终止。 “}

在提名插入

{的情况下” 的INSERT语句冲突具有外键约束\ “FK_dbo.Addresses_dbo.AccountHolders_AccountHolderId \”。冲突发生于数据库\ “CodeFirst.BankContext \”,表\ “dbo.AccountHolders \”,列 'AccountHolderId'。\ r \ n该语句已终止。“}

Cananybody请告诉我如何解决这个问题,我在这里丢失了什么?

回答

4

您尝试插入地址Nominees_NomineeId不存在于代名词中。您应该提名的第一个实例然后填充值并创建Address和填充值最后创建AccountHolder.and的实例,然后保存

+0

感谢的答案,它的工作原理。但现在每当我将插入提名人或账户持有人,我要创建为账户持有插入,并在提名插入的情况下,账户持有空对象的情况下,被提名人的空对象,有没有办法让我可以为这两种设置的默认值这些导航属性? – gaurav 2013-03-03 13:30:42

+0

我想你应该插入值,然后使用它,例如你必须在表中插入值,然后使用它。 – 2013-03-03 13:32:46

+0

好吧,但只是为了好奇心什么是为两者设置默认值的问题? – gaurav 2013-03-03 13:35:41

1

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

如果您有SQL Server Management Studio中,打开它,并sp_help将 'dbo.dbo.Nominees'。查看FK所在的列,以及它引用哪个表的列。你插入了一些不好的数据。对sp_help'dbo.dbo.AccountHolders'做同样的处理。

希望这会有所帮助。

相关问题