我有一个共享关系列的数据库。这是精简表结构
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.我如何正确建模并映射它?
答案 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}
}