0

関係の列を共有するデータベースがあります。これが要約テーブル構造です

Order
----------
OrderId int IDENTITY

OrderLine
----------
OrderId int NOT NULL
OrderLine int NOT NULL

OrderNote
----------
NoteId uniqueidentifier NOT NULL
OrderId int NOT NULL
OrderLineId int NULL

基本的に、OrderNoteテーブルはOrderとOrderLineの間で共有されます。OrderLineId列がnullの場合、メモは注文に属します。OrderLineId列が存在する場合、メモは注文行に属します。私のクラスは次のようになります。

class Order {
    int OrderId {get; set;}
    IList<OrderLine> Lines {get;}
    IList<OrderNote> Notes {get;}
}

class OrderLine {
    int OrderLineId {get; set;}
    Order Order {get; set;}
    IList<OrderNote> Notes {get;}
}

class OrderNote {
    Order Order {get; set;}
    OrderLine Line {get; set;}
    Guid NoteId {get; set;}
}

OrderNote.Lineがnullの場合、メモはOrderにのみ属します。OrderNote.Lineがnullでない場合、メモは注文と行に属します。これが私のマッピングがどのように見えるかです:

class OrderClassMap {
    Id(x => x.OrderId).Generated.Identity();
    HasMany(x => x.Lines).Inverse().KeyColumn("OrderId");
    HasMany(x => x.Notes).Inverse().KeyColumn("OrderId");
}

class OrderLineClassMap {
    CompositeId().KeyReference(x => x.Order, "OrderId").KeyProperty(x => x.OrderLineId);
    HasMany(x => x.Notes).Inverse().KeyColumns.Add("OrderId", "OrderLineId");
}

class OrderNoteClassMap {
    Id(x => x.NoteId).Generated.Assigned();
    References(x => x.Order).Column("OrderId");
    References(x => x.Line).Columns("OrderId", "OrderLineId");
}

新しいOrderNoteを保存しようとすると、「Count = 11のこのSqlParameterCollectionのインデックス11が無効です。これを正しくモデル化してマップするにはどうすればよいですか?」というエラーが表示されます。

4

1 に答える 1

0

注文ごとに 1 つのメモとオーダーラインごとに 1 つのメモだけについて話しているようですか? その場合は、メモを注文の列としてマップし、オーダーラインのメモ列としてもマップします。これは、少ない結合と単純なクエリでパフォーマンスに大きな影響を与えます (それ以外の場合は、左外部結合と合体ステートメントが必要です)。

注文と注文行ごとに複数のメモを作成できる場合は、別の ordernote と orderlinenote 値オブジェクトを作成します。注文/注文行ごとに 1 つ以上のメモを持つ必要があるかどうかによって異なります。これが最も簡単で最高のパフォーマンスを提供し、ordernote と orderlinenote はドメイン設計の点で異なるため、むしろエンティティごとに 1 つのメモに傾倒します。

class Order {
    int OrderId {get; set;}
    IList<OrderLine> Lines {get;}
    string Note {get;set;}
}

class OrderLine {
    int OrderLineId {get; set;}
    Order Order {get; set;}
    string Note {get;set}
}

また

class Order {
    int OrderId {get; set;}
    IList<OrderLine> Lines {get;}
    IList<OrderNote> Notes {get;}
}

class OrderNote {
    int Id {get;set}
    Order Order {get; set;}
    string Note {get; set;}
}

class OrderLine {
    int OrderLineId {get; set;}
    Order Order {get; set;}
    IList<OrderLineNote> Notes {get;}
}

class OrderLineNote {
    int Id {get; set;}
    OrderLine OrderLine {get; set;}
    string Note {get;set}
}
于 2012-05-17T06:01:03.353 に答える