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 列为空,则说明属于订单。如果存在 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 为空,则说明仅属于订单。如果 OrderNote.Line 不为空,则注释属于订单和行。这是我的映射的样子:

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 时,我收到一条错误消息:“此 SqlParameterCollection 的索引 11 无效,Count=11。如何正确建模和映射它?

4

1 回答 1

0

您似乎在谈论每个订单仅 1 个便笺和每个订单行 1 个便笺?如果是这样,请将注释映射为按顺序排列的列,同时也是订单行的注释列。这将对具有较少连接和简单查询的性能产生重大影响 - (否则您需要左外连接和合并语句)。

如果每个订单和订单行可以有多个注释,则创建单独的 ordernote 和 orderlinenote 值对象。取决于每个订单/订单行需要多于 1 个票据。倾向于每个实体 1 个注释,因为这是最简单的并且提供最佳性能,并且 ordernote 和 orderlinenote 在域设计方面是不同的。

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 回答