外键实体框架问题

时间:2012-04-26 13:14:35

标签: c# .net

我有一个父子实体:

public class Transaction
{
  public int TransactionId {get; set;}
  public int? OrderId {get; set;}
  public virtual Order Order {get; set;}

} 

public class Order 
{
  public int Id {get; set;}
  public virtual List<OrderItems> OrderItems {get; set;}
}

public class OrderItem
{
  public int Id {get; set;}
  public string Item {get; set;}
  public virtual int OrderId {get; set;}
  public virtual Order Order {get; set;}
}

上下文如下:

   modelBuilder.Entity<Transaction>( )
            .HasKey( x => x.TransactionId )
            .ToTable( "Transactions" );

        modelBuilder.Entity<Transaction>( )
            .HasOptional( x => x.Order )
            .WithMany( )
            .HasForeignKey( t => t.OrderId );

        modelBuilder.Entity<Order>( )
            .HasKey( o => o.Id )
            .ToTable("Orders");

        modelBuilder.Entity<OrderItem>( )
            .HasKey( i => i.Id )
            .ToTable( "OrderItems" );


        modelBuilder.Entity<OrderItem>( )
            .HasRequired( x => x.Order )
            .WithMany( o => o.OrderItems )
            .HasForeignKey( p => p.OrderId );

当我尝试创建一个类型为Transaction的新实体时,类似于:

var transaction = new Transaction 
                   {TransactionId = Guid.NewGuid;
                    Order = new Order {OrderItems = new List<OrderItems>{Item="SunCream"}}};

ctx.Transactions.Add(transaction);
ctx.SaveChanges();

我得到了

  

INSERT语句与FOREIGN KEY约束冲突   “FK_Transactions_Orders_OrderId”。冲突发生在数据库中   “交易”,表“dbo.Orders”,列“Id”。

我到底错在了什么?

1 个答案:

答案 0 :(得分:1)

我认为您需要在添加事务之前先将Order对象显式添加到ctx对象。这样,当您调用.SaveChanges()上下文时,它将知道它必须在您提交事务之前先提交订单。