2012-05-16 57 views
0

我有一個數據庫共享列的關係。這裏是精簡表結構流利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 

基本上Order Order和OrderLine之間共享OrderNote表。如果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不爲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,我得到一個錯誤說「無效的指數11本SqlParameterCollection以計數= 11我如何正確模擬和地圖這個?

回答

0

看來你是在談論每個訂單隻有1個鈔票和每個訂單行1個鈔票?如果是這樣,請將該鈔票按順序映射爲一個列,並且還要爲該命令行記錄一個備註欄。更少的連接和簡單的查詢 - (否則你需要左外連接和合並語句)

如果你可以有多個註釋每o rder和orderline然後創建單獨的ordernote和orderlinenote值對象。取決於每個訂單/訂單更多1注的需求。每個實體傾向於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} 
} 
+0

需要有每筆訂單和訂單行多個音符。這樣設計的原因在於,Order實際上包含了所有的筆記對象,甚至包含了屬於這些筆劃的筆記對象。所以要清楚。有沒有辦法在NHibernate中共享這樣的列? – awilinsk

+0

它看起來像NHibernate沒有辦法解決這個問題。我希望這是因爲OrderLine和OrderNote使用的組合鍵有一個引用返回OrderId,我不必創建一個重複的列。我最終爲OrderLine引用創建了一個重複的列。 – awilinsk