2011-05-19 107 views
3

我正在學習使用流利的nhibernate,並且無法理解如何創建映射。我有一個具有多列主鍵的表,但我無法正確映射它。我有以下流利的映射 -nhibernate流利的映射覆合ID

public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity> 
    { 
     public void Override(AutoMapping<MyEntity> mapping) 
     { 
      mapping.CompositeId() 
       .KeyProperty(x => x.Id_1, "Id_1") 
       .KeyProperty(x => x.Id_2, "Id_2"); 

      mapping.References(x => x.otherEntity) 
       .Column("JoinColumn"); 

      // Commented out to attempt to map to another entity on multiple columns 
      //mapping.HasMany(x => x.thirdEntit) 
      // .KeyColumns.Add("thirdId_1", "thirdId_2") 
      // .Cascade.All(); 



     } 
    } 

我遇到的問題是複合ID似乎並沒有工作。

這是從生產的映射文件的一個片段 -

<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="identity" /> 
    </id> 

我再拿到該列(ID),在查詢任何表中不存在錯誤。

我錯了,認爲我的映射代碼會產生正確的複合ID?我錯過了什麼或者做錯了什麼嗎?

+0

也許NHibernate自動映射約定重寫你的流暢映射? – rebelliard 2011-05-19 13:23:38

+0

也許就是這個問題 - 我將不得不考慮這個問題。注 - 我已經改編了SharpArchitecture中的一些作品來映射我的域名。我只是看着,可能會發生一些事情。我會看看。 – czuroski 2011-05-19 13:38:50

+0

夏普?這絕對是。我有同樣的問題,我不得不修改主鍵約定,所以它忽略了我的具體類型。 – rebelliard 2011-05-19 14:02:49

回答

3

它的建議(我已經有很多成功的),如果你正在做CompositeKeys你使用一個ID對象按:

NHibernate and Composite Keys

在你的情況,你需要創建一個新的類...

[Serializable] 
public MyEntityIdentifier 
{ 
    public virtual TYPE Id_1; 
    public virtual TYPE Id_2; 

    // You need to override Equals(MyEntityIdentifier), Equals(object obj) and GetHashCode() 
} 

那麼你的映射變得

public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity> 
{ 
     public void Override(AutoMapping<MyEntity> mapping) 
     { 
      mapping.CompositeId() 
       .ComponentCompositeIdentifier(x => x.MyEntityIdentifier) 
       .KeyProperty(x => x.MyEntityIdentifier.Id_1, Id_1, "Id_1") 
       .KeyProperty(x => x.MyEntityIdentifier.Id_2, "Id_2"); 

      // snip 
     } 
} 

而且你的班級從擁有兩個屬性(Id_1 & Id_2)變爲僅擁有MyEntityIdentifier。

然後你用你的MyEntityIdentifier哪裏需要加載..

MyEntity entity = Session.Load<MyEntity>(new MyEntityIdentifier { Id_1 = Whatever, Id_2 = Whatever }); 

而且,如果你還擁有了這個數據庫,我會強烈建議不要使用CompositeKeys任何控制。雖然NHibernate肯定會處理它們,但它們會帶來一些額外的心理複雜性和問題。

+0

謝謝 - 我會檢查這一點。不幸的是,我完全無法控制數據庫模式,所以我必須處理我所擁有的... – czuroski 2011-05-19 13:40:50

+0

我完全知道這是什麼。 – 2011-05-19 21:20:04