流畅的NHibernate映射外键

时间:2011-03-24 17:54:34

标签: nhibernate fluent

我有一个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和用户授权来获取权限列表。 我的问题是:如何在用户映射中映射权限列表?我应该使用三元协会吗?

有没有人对如何做到这一点有任何见解?

1 个答案:

答案 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();
}