NH 3.3按代码进行复合ID映射

时间:2012-08-01 15:55:44

标签: nhibernate nhibernate-mapping

Diagram

我想把头发拉出来试图弄清楚如何映射下面列出的UsersRoles表。我看起来不是很好,所以请帮忙:)。

//这是实体

public class UsersRole
{
    public UsersRole() { }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    public virtual System.Guid UserId { get; set; }
    public virtual System.Guid RoleId { get; set; }


}

//这是到目前为止的映射

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        Table("UsersRoles");
        Lazy(true);

       // ComponentAsId(); How does this work??


        Property(x => x.UserId, map => map.Column(c =>
            {
                c.Name("UserId");
                c.NotNullable(true);
                c.Length(30);
                c.SqlType("uniqueidentifier");
            }));
        Property(x => x.RoleId, map => map.Column(c =>
            {
                c.Name("RoleId");
                c.NotNullable(true);
                c.Length(30);
                c.SqlType("uniqueidentifier");
            }));
    }
}

请参阅ComponentAsId映射中的注释

如果有人能让我走上正轨,请提前致谢

3 个答案:

答案 0 :(得分:2)

您要查找的方法称为ComposedId

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        ComposedId(map => 
        {
            map.Property(x => x.UserId);
            map.Property(x => x.RoleId);
        });
    }
}

回答有关ComponentAsId如何运作的问题。您应该使用以下类来使用ComponentAsId方法

public class UsersRoleId
{
    public System.Guid UserId { get; set; }
    public System.Guid RoleId { get; set; }
}

public class UsersRole
{
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    public virtual UsersRoleId Id { get; set; }
}

现在您可以将UsersRole.Id映射为ComponentAsId

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        ComponentAsId(x => x.Id);
    }
}

PS :为什么需要映射UsersRoles表?我建议你将用户映射到多对多关系角色。

public class UsersMap : ClassMapping<User>
{
    public UsersMap()
    {
        Set(x => x.Roles, x => { }, x => x.ManyToMany());
    }
}

public class RolesMap : ClassMapping<Role>
{
    public RolesMap()
    {
        Set(x => x.Users, x => { }, x => x.ManyToMany());
    }
}

答案 1 :(得分:1)

你真的需要UsersRole作为一个实体吗?通常,除了两个ID之外,在数据库表中有一些额外的列时,您只创建一个多对多实体。

此外,即使您需要创建单独的实体,也不需要具有UserIdRoleId属性。拥有UserRole属性就足以与NHibernate进行映射。

请查看多对多映射,并定义您的用户实体,如下所示:

public class User
{
    // other properties
    public virtual IList<Role> Roles { get; set; }
}

现在,您可以使用ManyToMany映射来映射该Role属性:

Bag(x => x.Roles, collectionMapping =>
{
    collectionMapping.Table("UsersRole");
    collectionMapping.Key(k => k.Column("RoleId"));
}, map => map.ManyToMany(p => p.Column("UserId")));

还有一个example

答案 2 :(得分:0)

以下是使用NHibernate Mapping-By-Code实现复合键映射的两种方法。

ComponentAsId(x => x.Key, m =>
{
    m.Property(x => x.KeyPart);
    // etc.
});

ComposedId(m =>
{
    m.Property(x => x.KeyPart);
    // other key parts
});