我注意到 default_schema 设置仅适用于生成的 SQL。用户提供的 SQL(在我的例子中:通过 Map().Formula())似乎不受 default_schema 设置的影响。
有没有办法解决?我尝试了天真的方法,尝试从映射类中的配置中读取 default_schema,然后更改 .Formula() 调用中的 SQL 以包含 default_schema,但即使从映射文件访问配置似乎也不是-琐碎的。
任何帮助将不胜感激!
问候, ldx
我注意到 default_schema 设置仅适用于生成的 SQL。用户提供的 SQL(在我的例子中:通过 Map().Formula())似乎不受 default_schema 设置的影响。
有没有办法解决?我尝试了天真的方法,尝试从映射类中的配置中读取 default_schema,然后更改 .Formula() 调用中的 SQL 以包含 default_schema,但即使从映射文件访问配置似乎也不是-琐碎的。
任何帮助将不胜感激!
问候, ldx
我自己解决了这个问题。
由于似乎无法访问 ClassMap 中的任何配置(而且我不想在那里手动开始读取配置文件),并且由于您不能通过某些 IoC 框架将依赖项注入 ClassMap (Classmaps 需要无参数构造函数),我必须用单例类以“老式方式”来做:
单身人士:
公共类 DefaultSchemaProvider { 私有静态 DefaultSchemaProvider _instance = null; 私有字符串_defaultSchema = null;
public static DefaultSchemaProvider Instance
{
get
{
if (_instance == null)
_instance = new DefaultSchemaProvider();
return _instance;
}
}
public void SetDefaultSchema(string defaultSchema)
{
_defaultSchema = defaultSchema;
}
public string GetDefaultSchema()
{
return _defaultSchema;
}
}
配置期间:
var nhibernateCfg = new NHibernate.Cfg.Configuration();
nhibernateCfg.Configure(ConfigurationFile);
DefaultSchemaProvider.Instance.SetDefaultSchema(nhibernateCfg.GetProperty("default_schema"));
在类图中:
public class CustomerMap : ClassMap<Customer>
{
public CustomerMap()
{
var defaultSchema = DefaultSchemaProvider.Instance.GetDefaultSchema() + ".";
Table("Customers");
Id(x => x.Id).Column("Customer_id");
Map(x => x.Description).Column("Name");
Component(c => c.CustomerType, c =>
{
c.Map(x => x.Id).Column("Customer_type");
c.Map(x => x.Description).Formula(
"(SELECT ct.value FROM " + defaultSchema + "customer_types ct WHERE ct.field='description' AND ct.typeid = Customer_type)");
});
HasMany(x => x.ArticleLinks).KeyColumn("VENR").Access.CamelCaseField(Prefix.Underscore);
}
}