2

我正在轮询安全信息的多个系统(域),所以我正在处理domainUsers及其角色。我有我的实体设置如下所示,但我无法在AutoMapper覆盖中设置domainUser.HasMany关系。如何覆盖复合标识的自动映射,与流畅的nhibernate一对多关系?

你会注意到我没有domainUser.DomainUserId和role.RoleId这使得这更简单(没有compositeIds。)我已经避免了这些字段,因为我已经有了一个自然的组合键,它当我从下游域中获取这些数据时将会填充。如果我添加这些人造键,那么在调用session.Merge(domainUser)之前,我必须预先获取它们的值。我试图避免这样做。

实体对象是显而易见的(我希望),但这里是我得到的。

public class DomainUser 
    { 
     public virtual int Domain_Id { get; set; } 
     public virtual string DomainUserLogin { get; set; } 
     public virtual string EmployeeId { get; set; } 

     // extra field removed for breviety 


     public DomainUser() 
     { 
     this.Roles = new List<DomainUserRole>(); 
     } 

     public virtual void AddRole(DomainUserRole role) 
     { 
     role.DomainUser = this; 
     this.Roles.Add(role); 
     } 

     // overrides for equals and getHashCode 
    } 

public class DomainUserRole 
    { 
     public virtual DomainUser DomainUser { get; set; } 
     public virtual string DataSegment { get; set; } // Some group of data a user has access to, like US or China 
     public virtual string RoleName { get; set; } 
     public virtual string RoleDescription { get; set; } 

     // extra field removed for breviety 

     // overrides for equals and getHashCode 
    } 

我的数据库架构是非常简单的。

alt text http://lh6.ggpht.com/_MV6QGBD11JE/S3iX2qcP_jI/AAAAAAAAEE0/PGIO07BlCSo/s800/Untitled.gif.jpg

我已经得到了IAutoMappingOverride类开始是这样的。但是,我不知道如何为角色设置hasMany。它一直给我

NHibernate.FKUnmatchingColumnsException: 
    Foreign key (FK20531BE4163641BB:tblDomainUserRoles [DomainUser])) 
    must have same number of columns as the referenced primary key 
    (tblDomainUsers [Domain_Id, DomainUserLogin]). 

如何设置外键使用这两个字段?

public class DomainUserMap : IAutoMappingOverride<DomainUser> 
    { 
     public void Override(AutoMapping<DomainUser> mapping) 
     { 
     mapping.CompositeId() 
      .KeyProperty(user => user.Domain_Id, "Domain_Id") 
      .KeyProperty(user => user.DomainUserLogin, "DomainUserLogin"); 

     // I"ve tried this. 
     // mapping.HasMany(x => x.Roles) 
     // .KeyColumns.Add("Domain_Id") 
     // .KeyColumns.Add("DomainUserLogin"); 

     // also tried this where I define this FK in DB with both fields. 
     // mapping.HasMany(x => x.Roles) 
     // .ForeignKeyConstraintName("FK_tblDomainUserRoles_tblDomainUsers") 

     } 
    } 

    public class DomainUserRoleMap : IAutoMappingOverride<DomainUserRole> 
     { 
      public void Override(AutoMapping<DomainUserRole> mapping) 
      { 
      mapping.CompositeId() 
       .KeyReference(role => role.DomainUser) 
       .KeyProperty(role => role.DataSegment) 
       .KeyProperty(role => role.RoleName);   
      } 
     } 

回答

0

我做了最终的手编辑HBM文件。看起来最新的流利Nhibernate版本解决了这个问题。这是我的hbm文件的样子。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="AAA.Core.Entities.DomainUser, AAA.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`tblDomainUsers`"> 
    <composite-id mapped="false" unsaved-value="undefined"> 
     <key-property name="Domain_Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Domain_Id" /> 
     </key-property> 
     <key-property name="DomainUserLogin" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DomainUserLogin" /> 
     </key-property> 
    </composite-id> 
    ... properties hidden for breviety 
    <bag inverse="true" cascade="all-delete-orphan" lazy="false" name="Roles"> 
     <key> 
     <column name="Domain_Id" /> 
     <column name="DomainUserLogin" /> 
     </key> 
     <one-to-many class="AAA.Core.Entities.DomainUserRole, AAA.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

这里是角色的文件。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="AAA.Core.Entities.DomainUserRole, AAA.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`tblDomainUserRoles`"> 
    <composite-id mapped="false" unsaved-value="undefined"> 
     <key-property name="DataSegment" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DataSegment" /> 
     </key-property> 
     <key-property name="RoleName" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="RoleName" /> 
     </key-property> 
     <key-many-to-one name="DomainUser" class="AAA.Core.Entities.DomainUser, AAA.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <column name="Domain_Id" /> 
     <column name="DomainUserLogin" /> 
     </key-many-to-one> 
    </composite-id> 
    ... properties hidden for breviety 
    </class> 
</hibernate-mapping> 
0

您可能想要使用组合键类。

使用密钥类here at SO的示例。但是,您可能必须下拉并使用HBM文件,而不是使用Fluent NHibernate。

相关问题