Pab*_*ote 9 .net nhibernate nhibernate-mapping fluent-nhibernate
我的项目需要处理三个数据库,这意味着三个会话工厂.问题是如果我用流利的nhibernate做这样的事情:
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
Run Code Online (Sandbox Code Playgroud)
工厂将获取所有映射,甚至是与另一个数据库相对应的映射
我已经看到,当使用自动化时,您可以执行类似的操作,并按命名空间过滤:
.Mappings(m => m.AutoMappings.Add(
AutoMap
.AssemblyOf<Product>()
.Where(t => t.Namespace == "Storefront.Entities")))
Run Code Online (Sandbox Code Playgroud)
我没有找到这样的流利映射,是否有可能?我能想到的唯一解决方案是:为每个db映射类创建单独的程序集,或者将每个实体显式添加到工厂配置中.
如果可能的话,我宁愿避免这两种情况.谢谢.
我已经在Fluent映射文件中使用(我自己的)属性来实现这个,以指示实体所属的数据库.我还有一个"默认"数据库的概念,并假设没有属性的映射文件驻留在默认的DB中(它可以减少你需要装饰的类的数量).然后我有初始化代码,它为每个数据库创建一个会话工厂,并为每个数据库使用反射来查找所有ClassMap类,检查属性以确定它属于哪个DB,并相应地注册每个ClassMap.
映射文件示例:
[FluentNHibernateDatabase("MySecurityDatabase")]
public class SystemUserMap : ClassMap<SystemUser>
{
public SystemUserMap()
{
Id(x => x.SystemUserId);
Map(x => x.LoginId);
Map(x => x.LoginPassword);
Map(x => x.UserFirstName);
Map(x => x.UserSurname);
References(x => x.UserOrganisation, "OrganisationId");
}
}
Run Code Online (Sandbox Code Playgroud)
显然我已经定义了引用/使用的DB列表.
我的实施工作到目前为止我已经采取了它,但我遇到了障碍(我希望有人可以提供帮助):
我在这里问了我的问题: 如何使用Fluent NHibernate和多个数据库识别特定实体的会话工厂
这样做的简单方法是将数据库名称放入Schema中
public sealed class CustomerMapping: ClassMap<Customer>
{
public CustomerMapping()
{
Schema("Northwind.dbo");
Table("Customer");
}
}
public sealed class Customer2Mapping: ClassMap<Customer2>
{
public CustomerMapping()
{
Schema("Northwind2.dbo");
Table("Customer");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如果可以在同一连接字符串上访问所有表,则只需要一个会话工厂
| 归档时间: |
|
| 查看次数: |
5965 次 |
| 最近记录: |