2012-04-26 26 views
1

私は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(); 

は私が

FOREIGN KEY制約 "FK_Transactions_Orders_OrderId" と競合INSERT文

を取得します。競合がデータベース "トランザクション"、テーブル "dbo.Orders"、列 'Id'で発生しました。

私は正確にここで間違っていますか?

答えて

1

トランザクションを追加する前に、Orderオブジェクトをctxオブジェクトに明示的に追加する必要があると私は考えています。このようにして.SaveChanges()と呼ぶと、コンテキストは、トランザクションをコミットする前に注文を最初にコミットしなければならないことを認識します。

+0

あなたは正しいです。ありがとう – Elena