我想把头发拉出来试图弄清楚如何映射下面列出的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映射中的注释
如果有人能让我走上正轨,请提前致谢
答案 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之外,在数据库表中有一些额外的列时,您只创建一个多对多实体。
此外,即使您需要创建单独的实体,也不需要具有UserId
和RoleId
属性。拥有User
和Role
属性就足以与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
});