2012-04-26 93 views
1

我有一个父子实体:外键实体框架问题

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); 

当我尝试创建类型交易的一个新的实体,是这样的:

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

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

我得到

INSERT语句冲突与外键约束 “FK_Transactions_Orders_OrderId”。冲突发生在数据库 “Transactions”,表“dbo.Orders”,列'Id'。

我究竟在做什么错在这里?

回答

1

我相信你需要在添加事务之前先将Order对象明确地添加到ctx对象中。通过这种方式,当您调用.SaveChanges()时,上下文将知道在提交事务之前必须首先提交订单。

+0

你是对的。谢谢 – Elena 2012-04-26 13:49:45