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

私は得る

INSERT ステートメントが FOREIGN KEY 制約 "FK_Transactions_Orders_OrderId" と競合しました。データベース「Transactions」、テーブル「dbo.Orders」、列「Id」で競合が発生しました。

ここで何が間違っているのですか?

4

1 に答える 1

1

トランザクションを追加する前に、最初に Order オブジェクトを ctx オブジェクトに明示的に追加する必要があると思います。そうすれば、コンテキストを呼び出すと.SaveChanges()、トランザクションをコミットする前に最初に注文をコミットする必要があることがわかります。

于 2012-04-26T13:24:56.830 に答える