2

我们有一个多租户数据库 - 即多个客户端使用的公共数据库,因此每个表将有一个“ClientID”列指示租户。我们正在使用 Fluent NHibernate for ORM 并寻找解决多租户问题的最佳方法:每个 Mapping 类都需要映射 ClientID,但是,该值将来自用户帐户对象 - 即来自某种用户会话。

有没有使用 Fluent NHibernate 实现这一目标的简便方法?如果是这样,你能举个例子吗?

4

1 回答 1

1

我不完全确定这是否是您的要求,但如果您需要每个类都映射到 ClientId,这是一个示例。

基本上,每个类都有一个 UserAccount 属性或任何类将存储具有 ClientId 属性的用户帐户信息。然后在您的 Fluent NHibernate 映射中,您可以使用 References() 方法将这些类映射在一起。请参见下面的示例:

public class UserAccount
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }

    public virtual IList<Bill> Bills { get; set; }
}

public class Bill
{
    public virtual int BillId { get; set; }

    public virtual UserAccount User { get; set; }
}

public class UserAccount : ClassMap<UserAccount>
{
    public UserAccount()
    {
        Id( x => x.Id ).Column( "ClientId" );

        Map( x => x.Name );

        HasMany( x => x.Bills );
    }
}

public class BillMap : ClassMap<Bill>
{
    public BillMap()
    {
        Id( x => x.Id ).Column( "BillId" );
        References( x => x.User ).Column( "ClientId" );
    }
}

因此,在您的 Bill 表中,您将有一个 ClientId 列,在数据库术语中它实际上是一个外键,它引用了 UserAccount 表的主键列,该列也将被命名为 ClientId。

如果您确实要拥有大量表,这些表都将具有 ClientId 列,您还可以选择将其抽象为您的实体继承的基类,该基类上已经具有 UserAccount 属性。您也可以对 Fluent NHibernate 映射文件执行相同的基类方法。

于 2012-08-03T06:32:51.827 回答