1

NHibernate でクラスをマッピングしていますが、2 つの異なるデータベースで同じマップを使用しています。これは Sybase Anywhere では機能しますが、SQLite では機能しません。

これは私のマップクラスです:

public FooMap()
{
    Property(x => x.Date, map =>
    {
        map.Column(c => c.Default("now(*)"));
        map.Generated(PropertyGeneration.Insert);
        map.NotNullable(true);
    });
}

これはマッパーです:

public class Provider
{
    public void AddMappings(ModelMapper mapper)
    {
        mapper.AddMappings(Assembly.GetAssembly(typeof(BaseMap)).GetExportedTypes().Where(x => x.Name.EndsWith("Map")));
    }
}

SQlite には NOW 関数がないため、Hibernate がこのテーブルを作成しようとするとエラーが発生します。

データベースに応じてデフォルト値を挿入するにはどうすればよいですか?

4

2 に答える 2

0

私は StructureMapMVC を使用しているので、これを行いました:

var db = DependencyResolver.Current.GetService<Provider>();

if (db == null)
{
    throw new NullReferenceException("Service Provider not found.");
}

if (db is SybaseProvider)
{
    map.Column(c => c.Default("now(*)"));
}
else // SQLite
{
    map.Column(c => c.Default("CURRENT_TIMESTAMP"));
}
map.Generated(PropertyGeneration.Insert);
map.NotNullable(true);

私のために働いた。

于 2013-08-07T11:56:31.690 に答える
0

データベースが異なれば日時のデフォルト値を生成する際に異なる関数が使用されることを念頭に置いて、オブジェクトの初期化時に値を生成するアプローチを採用します。

Default Value does not work with DateTime and Fluent Nhibernate 1.2フォーラムスレッドを参照してください。回答の一部として次の内容が含まれています。

プロパティ/フィールドのデフォルト値を指定するには、通常のフィールドと同じように割り当てます。フィールド定義またはエンティティのコンストラクターで設定します。特別なことは必要ありません。

このアプローチに従うと、日時のデフォルト値がどのように生成されるかを気にせずに、さまざまなデータベースを操作できます。

于 2013-08-08T05:33:46.190 に答える