4

Remove を使用してコレクションから項目を削除できるように、Entity Framework で識別関係を機能させようとしています。

次のようなテストを作成しました。

public class OrderLine{   
    [Key, Column(Order = 0)]
    public int OrderLineId { get; set; }

    [Key, ForeignKey("Order"), Column(Order = 1)]
    public int OrderId{ get; set; }

    public virtual Order Order{ get; set; }

    [ForeignKey("Product")]
    public int ProductId { get; set; }

    public virtual Product Product { get; set; }

    public int Number { get; set; }}

次のような OrderLine を追加しようとすると:

        var order=_orderRepository.Find(1);
        var NewOrderLine= new OrderLine()
                                            {
                                                Number = 1,ProductId= 2
                                            };
        order.OrderLines.Add(NewOrderLine);
        _orderRepository.InsertOrUpdate(order);
        _orderRepository.Save();

エラーが発生します

IDENTITY_INSERT が OFF に設定されている場合、テーブル 'OrderLines' の ID 列に明示的な値を挿入できません。

テーブルを見ると、SQL には OrderId と OrderLineId に対する主キーがあります。また、OrderLineId のみが ID として設定されます。したがって、値を挿入しようとしているに違いありませんが、挿入しようとしているように見える唯一の値は 0 です。

次を使用してテーブルに挿入できるアイデアはすべて次のとおりです。

INSERT INTO [OrderLines]
           ([ProductId ]
           ,[Number]
           ,[OrderId])
     VALUES
           (2
           ,1
           ,1)
4

1 に答える 1

7

例外は、テーブル内の複合主キー列の1つがOrderLinesデータベース内の自動生成されたID(列だと思いますOrderLineId)であることを意味すると思いますが、EFは値を送信します(0新しいを作成するときにプロパティを指定しないためOrderLine)。プロパティがEFモデルでIDとしてマークされていないため、データベースへのINSERTステートメントのこの列。デフォルト(= IDENTITY_INSERTis OFF)では、SQLServerはID列に値を明示的に挿入することを許可していません。

実際、マッピングでは、複合キーのデフォルトではプロパティがIDではないため、キー列はIDではありません。

解決策は、データベースでID仕様をオフにするか、モデルでプロパティをIDとしてマークすることだと思います。

public class OrderLine
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OrderLineId { get; set; }

    [Key, ForeignKey("Order"), Column(Order = 1)]
    public int OrderId { get; set; }

    public virtual Order Order { get; set; }

    // ...
}

DatabaseGeneratedOption.Identityこれは、EFが列の値がデータベースで生成されることを期待しているため、新しいエンティティを挿入しようとしたときに値をDBに送信しないことを意味します。

于 2012-06-15T13:16:56.250 に答える