流畅的NHibernate关系共享列

时间:2012-05-16 18:18:18

标签: fluent-nhibernate

我有一个共享关系列的数据库。这是精简表结构

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

1 个答案:

答案 0 :(得分: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}
}