2012-06-25 171 views
0

我有以下的域对象:多对多映射问题

public class UserSpecialization : PersonSpecialization, IUserSpecialization 
{ 
    public static readonly string SpecializationNameValue = "User"; 

    public UserSpecialization() 
    { 
     Roles = new Collection<IRole>(); 
    } 

    public virtual IEnumerable<IRole> Roles 
    { 
     get; 
     set; 
    } 
} 

public abstract class PersonSpecialization : DomainObjectOfInt32, IPersonSpecialization 
{ 
    public virtual IPerson Person { get; set; } 
    public virtual string SpecializationName { get; protected set; } 
} 

public class Person : DomainObjectOfInt32, IPerson, IAuditable 
{ 
    public Person() 
    { 
     Specializations = new List<IPersonSpecialization>(); 
    } 

    public virtual IList<IPersonSpecialization> Specializations { get; protected set; } 
} 

public abstract class Role : DomainObjectOfInt32, IRole, IAuditable 
{ 
    public Role(string roleName) 
     : this() 
    { 
     Name = roleName; 
    } 
    protected Role() 
    { 
     AssignedUsers = new Collection<IUserSpecialization>(); 
    } 

    public virtual ICollection<IUserSpecialization> AssignedUsers 
    { 
     get; 
     protected set; } 
} 

我的映射如下:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany<PersonSpecialization>(c => c.Specializations) 
      .Cascade.AllDeleteOrphan(); 
    } 
} 

public class RoleMap : ClassMap<Role> 
{ 
    public RoleMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasManyToMany<UserSpecialization>(x => x.AssignedUsers).Table("UserRole"); 
     DiscriminateSubClassesOnColumn("Type"); 
    } 
} 

public class PersonSpecializationMap : ClassMap<PersonSpecialization> 
{ 
    public PersonSpecializationMap() 
    { 
     Table("PersonSpecialization"); 

     Id(c => c.Id).GeneratedBy.Identity(); 

     DiscriminateSubClassesOnColumn<string>("SpecializationName"); 

     Map(x => x.SpecializationName).ReadOnly(); 

     References<Person>(c => c.Person); 
    } 
} 

现在,当我选择一个人,我也得到角色收集他所有的角色。在保存角色时,所有链接的人员都可以很好地保存。 但是,当我保存一个人,该人的链接角色不保存。

我该如何解决这个问题?

UserSpecialization的映射:

public class UserSpecializationMap : SubclassMap<UserSpecialization> 
{ 
    public UserSpecializationMap() 
    { 
     Table("User"); 

     DiscriminatorValue(UserSpecialization.SpecializationNameValue); 

     Join("[User]", joined => 
     { 
      joined.Map(c => c.UserName, "Username"); 

      joined.HasManyToMany<Role>(x => x.Roles).Inverse() 
       .Table("UserRole"); 
     }); 
    } 
} 
+1

你能否提供你的代码保存? – harry180

回答

0

你缺少

public class UserSpecializationMap : SubclassMap<UserSpecialization> 
{ 
    public UserSpecializationMap() 
    { 
     Table("PersonSpecialization"); 

     Id(c => c.Id).GeneratedBy.Identity(); 

     DiscriminatorValue("UserSpecialization"); 

     HasManyToMany(x => x.Roles).Cascade.All()...; 
    } 
} 

BTW:我使用的specializationName多晶型属性,那么你不需要专门初始化属性,可以不要忘记它在一个der class的课堂上,它不会占用空间。

// base class 
public abstract string SpecializationName { get; } 

// dereived class 
public override string SpecializationName { get { return "User"; } } 
+0

对不起,我忘了添加UserSpecializationMap: public class UserSpecializationMap:SubclassMap {public UserSpecializationMap(){Table(“User”); DiscriminatorValue(UserSpecialization.SpecializationNameValue); Join(“[User]”,joined => {joined.Map(c => c.UserName,“Username”); joined.HasManyToMany (x => x.Roles).Inverse()。Table(“UserRole”);});}}我删除了' Inverse()'。现在,当我尝试保存一个人(与角色链接)时,我得到:Nhibernate.PropertyAccessException:异常发生的get.DomainObjectOfInt32.Id getter。 InnerException:对象与目标类型不匹配。 – Djave

+0

将映射添加到问题中,在评论中几乎无法读取 – Firo

+0

我根据你的改变了我的映射,它的工作,非常感谢! – Djave