こんなモデルができたら…
public class Order
{
[Key, Column(Order = 1)]
public int CustomerId { get; set; }
[Key, Column(Order = 2)]
public int OrderId { get; set; }
public ICollection<OrderItem> Items { get; set; }
}
public class OrderItem
{
[Key, Column(Order = 1)]
public int CustomerId { get; set; }
[Key, Column(Order = 2)]
public int OrderId { get; set; }
[Key, Column(Order = 3)]
public int OrderItemId { get; set; }
}
...データベースにグラフを追加するときに、外部キーの値OrderItem.CustomerId
をOrderItem.OrderId
手動で提供する必要はありません。Order - OrderItems
var order = new Order
{
CustomerId = 5,
OrderId = 1,
Items = new List<OrderItem>
{
// I don't need to set CustomerId and OrderId here
new OrderItem { OrderItemId = 12 }
}
};
context.Orders.Add(order);
context.SaveChanges();
SaveChanges
Order
とを挿入する SQL ステートメントを生成しますOrderItem
。それOrderItem
は次のとおりです。
exec sp_executesql N'insert
[dbo].[OrderItems]([CustomerId], [OrderId], [OrderItemId])
values (@0, @1, @2)
',N'@0 int,@1 int,@2 int',@0=5,@1=1,@2=12
そのため、FKCustomerId
とOrderId
は正しく設定されています (@0=5
と@1=1
)。
ただし、Customer
ナビゲーション プロパティをモデルに追加するだけで、エンティティへの別の関係をモデルに追加するとOrder
...
public Customer Customer { get; set; }
...Customer
このようなクラスで...
public class Customer
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CustomerId { get; set; }
}
...そして、上記と同じコードを呼び出します ( DB にCustomer
with CustomerId
=5
が存在すると仮定して) 次の SQL を取得します。
exec sp_executesql N'insert
[dbo].[OrderItems]([CustomerId], [OrderId], [OrderItemId])
values (@0, @1, @2)
',N'@0 int,@1 int,@2 int',@0=0,@1=1,@2=12
ほぼ同じですがCustomerId
、0
この場合 ( @0=0
) は関係の外部キー制約違反になりOrder - OrderItem
ます。Customer
with CustomerId
=0
が存在し、この顧客がOrder
with OrderId
=を持っていた場合1
、例外は発生せずOrderItem
、間違った注文に追加され、例外よりも悪い可能性があります。
CustomerId
この問題は、 (FK の一部である) を new に設定することで修正できますOrderItem
。
Items = new List<OrderItem>
{
// I don't need to set OrderId here, BUT CustomerId
new OrderItem { CustomerId = 5, OrderItemId = 12 }
}
または - Id を持つ顧客をコンテキストに添付することで修正でき5
ます (なぜそれが機能するのかわかりません)。
FK (またはこの例では FK の一部) を手動で提供しなければならない合理的な説明はありますか、それともバグですか?
(このモデルでは、EF 5.0 と .NET 4.0 を使用しました。)