Fluent nhibernate Fluent NHibernate共享列的关系

Fluent nhibernate Fluent NHibernate共享列的关系,fluent-nhibernate,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和OrderL

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

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;}
}
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时,我得到一个错误“此计数为11的SqlParameterCollection的索引11无效。我如何正确地建模和映射这一点?

似乎您所说的每个订单只有一个注释,每个订单行只有一个注释?如果是这样,请将注释映射为顺序中的一列,以及顺序行中的注释列。使用较少的联接和简单查询(否则需要左外部联接和合并语句)将对性能产生很大影响

如果每个订单和订单行可以有多个注释,则创建单独的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}
}
类顺序{
int OrderId{get;set;}
IList行{get;}
字符串注释{get;set;}
}
类命令行{
int OrderLineId{get;set;}
顺序{get;set;}
字符串注释{get;set}
}

类顺序{
int OrderId{get;set;}
IList行{get;}
IList注释{get;}
}
类订单说明{
int Id{get;set}
顺序{get;set;}
字符串注释{get;set;}
}
类命令行{
int OrderLineId{get;set;}
顺序{get;set;}
IList注释{get;}
}
类OrderLineNote{
int Id{get;set;}
命令行命令行{get;set;}
字符串注释{get;set}
}

每个订单和订单行需要有多个注释。这样设计的原因是,顺序实际上包含所有注释对象,甚至是属于行的对象。所以我要说清楚。在NHibernate中没有办法共享这样的专栏?看来在NHibernate中没有办法。我希望,因为OrderLine和OrderNote使用了一个复合键,该键具有对OrderId的引用,所以我不必创建重复的列。我最终为OrderLine引用创建了一个重复的列。
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}
}