gpt4 book ai didi

nhibernate - 流畅的 NHibernate 映射外键

转载 作者:行者123 更新时间:2023-12-02 06:44:57 26 4
gpt4 key购买 nike

我有一个数据库,我正在尝试使用 Fluent NHibernate 对其进行建模。

问题中的表格是:

用户:PK Id、名称、FK 访问类型、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; }
}

用户 map :

    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]) 相同的列数

我需要通过检查用户访问类型和用户授权来获取权限列表。我的问题是:如何在用户映射中映射权限列表?我应该使用三元关联吗?

有人知道如何做到这一点吗?

最佳答案

不支持此方案。 NHibernate 有一个称为 property-ref 的功能,可以在设计不佳的旧数据库上使用(但应该避免)。但是,property-ref 仅支持引用一个非主键列。由于您试图引用两个这样的列,因此这是行不通的。

但是,由于权限显然与用户本身无关,因此您甚至不应该映射它们。

您仍然可以在 Users 类中拥有列表的属性,并使用一个额外的方法填充该属性,该方法只需在两列上使用 Where 条件来读取权限。不过,我还是建议不要这样做。我会写一个这样的方法(代码未测试):

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

关于nhibernate - 流畅的 NHibernate 映射外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com