我有一个db,我正在尝试使用Fluent NHibernate进行建模。
问题中的表格是:
用户: PK Id,Name,FK accessType,FK授权
接入类型: PK Id,名称
授权: PK Id,名称
许可: PK Id,FK menuId,FK accessId,FK authId
用户实体:
public Users()
{
Permissions = new List<Permissions>();
}
public virtual AccessTypes AccessType { get; set; }
public virtual Authorization Authorization { get; set; }
public virtual string Name { get; set; }
public virtual IList<Permissions> Permissions { get; set; }
许可实体:
public class Permissions : EntityWithTypedId<long>
{
public virtual Menus Menu { get; set; }
public virtual AccessTypes AccessType { get; set; }
public virtual Authorization Authorization { get; set; }
}
用户地图:
public UsersMap()
{
Table("USERS");
Map(x => x.Name, "NAME");
References<AccessTypes>(x => x.AccessType, "ACCESS_TYPE_ID");
References<Authorization>(x => x.Authorization, "AUTHORIZATION_ID");
Id(x => x.Id, "ID")
.Column("ID")
.GeneratedBy.Assigned();
HasMany<Permissions>(x => x.Permissions)
.KeyColumns.Add("ACCESS_TYPE_ID", "AUTHORIZATION_ID")
.Inverse()
.Cascade.None();
}
许可地图:
public PermissionsMap()
{
ReadOnly();
Table("PERMISSIONS");
References<Menus>(x => x.Menu, "MENU_ID");
References<AccessTypes>(x => x.AccessType, "ACCESS_TYPE_ID");
References<Authorization>(x => x.Authorization, "AUTHORIZATION_ID");
Id(x => x.Id, "ID")
.Column("ID")
.GeneratedBy.Assigned();
}
我收到此错误:外键(FK79B2A3E83BA4D9E3:PERMISSIONS [ACCESS_TYPE_ID,AUTHORIZATION_ID]))必须与引用的主键具有相同的列数(USERS [ID])
我需要通过检查用户accessType和用户授权来获取权限列表。 我的问题是:如何在用户映射中映射权限列表?我应该使用三元协会吗?
有没有人对如何做到这一点有任何见解?
答案 0 :(得分:3)
不支持此方案。 NHibernate有一个名为property-ref的功能,可以在设计不佳的旧数据库上使用(但应该避免)。但是,property-ref仅支持引用一个非主键列。由于您尝试引用两个此类列,因此无效。
但是,由于权限显然与用户本身无关,因此您甚至不应映射它们。
您仍然可以拥有Users类中列表的属性,并使用额外的方法填充该属性,该方法只使用两列上的Where-condition读取权限。不过,我会建议不要这样做。我会写一个像这样的方法(代码未测试):
public IList<Permissions> GetPermissionsForUser(Users user)
{
return session.QueryOver<Permissions>()
.Where(p => p.Authorization.Equals(user.Authorization))
.And(p => p.AccessType.Equals(user.AccessType)).List();
}