0

default_schema 設定は、生成された SQL に対してのみ機能することに気付きました。ユーザー提供の SQL (私の場合: Map().Formula() 経由) は、default_schema 設定の影響を受けないようです。

これを回避する方法はありますか?マッピングクラスの構成から default_schema を読み取ってから、.Formula() 呼び出しで SQL を変更して default_schema を含めるという単純なアプローチを試みましたが、マッピングファイルから構成にアクセスすることさえできないようです。 -些細なこと。

どんな助けでも大歓迎です!

よろしく、ldx

4

1 に答える 1

0

私はこれを自分で解決しました。

ClassMap の構成にアクセスすることは不可能に思われるため (構成ファイルを手動で読み取り始めたくありませんでした)、IoC フレームワークを介して ClassMap に依存関係を注入することはできないため (Classmap にはパラメーターのないコンストラクターが必要です)、シングルトンクラスを使用して「昔ながらの方法」で行う必要がありました。

シングルトン:

public class DefaultSchemaProvider { private static 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);
    }                
}
于 2012-04-23T09:55:59.513 に答える