我们有一个多租户数据库 - 即多个客户端使用的公共数据库,因此每个表将有一个“ClientID”列指示租户。我们正在使用 Fluent NHibernate for ORM 并寻找解决多租户问题的最佳方法:每个 Mapping 类都需要映射 ClientID,但是,该值将来自用户帐户对象 - 即来自某种用户会话。
有没有使用 Fluent NHibernate 实现这一目标的简便方法?如果是这样,你能举个例子吗?
我们有一个多租户数据库 - 即多个客户端使用的公共数据库,因此每个表将有一个“ClientID”列指示租户。我们正在使用 Fluent NHibernate for ORM 并寻找解决多租户问题的最佳方法:每个 Mapping 类都需要映射 ClientID,但是,该值将来自用户帐户对象 - 即来自某种用户会话。
有没有使用 Fluent NHibernate 实现这一目标的简便方法?如果是这样,你能举个例子吗?
我不完全确定这是否是您的要求,但如果您需要每个类都映射到 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 映射文件执行相同的基类方法。