2011-05-19 93 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