次に、Fluent NHibernate とその自動マッピング機能を使用して、次の単純化された POCO クラスをマッピングします。
public class Foo
{
public virtual int Id { get; set; }
public virtual datetime CreatedDateTime { get; set; }
}
CreatedDateTime フィールドは、デフォルトで SQL DateTime にマップされます。ただし、エンティティが正しく作成されていることを確認するテストを行うと、失敗します。これは、DateTime フィールドの精度が SQL データベース全体で維持されていないためです。この背後にある理由は、MS SQL Server の DateTime は、.000、.003、または .007 の増分に丸めることによってミリ秒の精度しか保持できないためであると考えています ( http://msdn.microsoft.com/en-us/libraryを参照)。 /ms187819.aspx )。このため、NHibernate はストアに保存するときにミリ秒を切り捨てます。これにより、.NET DateTime として正しく永続化されたフィールドがミリ秒を保持しているが、保存後に取得された DateTime がミリ秒を失ったため、2 つが真に等しくないことを確認すると、テストが失敗します。
この問題を克服するために、次のマッピングを Foo オブジェクトに追加しました。
public class FooMap : IAutoMappingOverride<Foo>
{
public void Override(AutoMapping<Foo> mapping)
{
mapping.Map(f => f.CreatedDateTime).CustomType("datetime2");
}
}
このマッピングにより、NHibernate は CreatedDateTime を SQL 型の datetime2 に保持し、.NET DateTime が可能な完全な精度を格納できることを理解しています。これはうまく機能し、テストはパスします。
ただし、1 つのパスには別の失敗が伴います: スキーマのエクスポートをチェックする私のテストは、次のエラーで失敗するようになりました:
System.ArgumentException : Dialect does not support DbType.DateTime2
Parameter name: typecode
次のスタック トレースを使用:
at NHibernate.Dialect.TypeNames.Get(DbType typecode)
at NHibernate.Dialect.Dialect.GetTypeName(SqlType sqlType)
at NHibernate.Mapping.Column.GetDialectTypeName(Dialect dialect, IMapping mapping)
at NHibernate.Mapping.Table.SqlCreateString(Dialect dialect, IMapping p, String defaultCatalog, String defaultSchema)
at NHibernate.Cfg.Configuration.GenerateSchemaCreationScript(Dialect dialect)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg, IDictionary`2 configProperties)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg)
このコードは、NHibernate.Tool.hbm2ddl.SchemaExport オブジェクトを使用して Execute メソッドを呼び出します。
Fluent v1 と NHibernate v2.1 を使用しています。
また、タイムスタンプへのマッピングを試みDateTime
ましたが、挿入が次のように失敗するため、マッピングを機能させることさえできませんでした。
タイムスタンプ列に明示的な値を挿入することはできません。列リストで使用INSERT
してタイムスタンプ列を除外するか、タイムスタンプ列に a を挿入しDEFAULT
ます。
誰もがSchemeExportをプロパティdatetime2
で動作させる方法またはタイムスタンプマッピングを取得する方法を知っていdatetime
ますか?