fluentnhibernate:default_schema和Formula

时间:2012-04-10 08:52:57

标签: nhibernate fluent-nhibernate

我注意到default_schema设置仅适用于生成 SQL。 用户提供的SQL(在我的例子中:通过Map()。Formula())似乎不受影响 通过default_schema设置。

这有什么办法吗? 我尝试阅读default_schema尝试了天真的方法 从映射类中的配置然后更改SQL 在.Formula()调用中包含default_schema,但是甚至 从映射文件访问配置似乎并不重要。

非常感谢任何帮助!

此致 LDX

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。

因为似乎无法访问ClassMap中的任何配置(我不想在那里手动开始读取配置文件),并且因为你不能通过一些IoC框架在ClassMap中注入依赖项(Classmaps需要一个无参数的构造函数), 我不得不用单身类的“老式方式”来做这件事:

单身人士:

公共类DefaultSchemaProvider {     private static DefaultSchemaProvider _instance = null;     private string _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"));

在classmap中:

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