tôi sau đó sử dụng thành thạo NHibernate và tính năng automapping của nó để lập bản đồ đơn giản lớp POCO sau:DateTime chính xác trong NHibernate và hỗ trợ cho DateTime2 trong NHibernate SchemeExport
public class Foo
{
public virtual int Id { get; set; }
public virtual datetime CreatedDateTime { get; set; }
}
Trường CreatedDateTime sẽ ánh xạ một DateTime SQL bởi mặc định. Tuy nhiên nếu tôi làm một bài kiểm tra để kiểm tra xem thực thể đó có được tạo đúng cách không. Điều này là do độ chính xác của trường DateTime không được duy trì thông qua cơ sở dữ liệu SQL. Tôi undersatnd lý do đằng sau này là một MS SQL Server DateTime chỉ có thể giữ độ chính xác milisecond bằng cách làm tròn đến gia số của .000, .003, hoặc .007 (xem http://msdn.microsoft.com/en-us/library/ms187819.aspx). Vì lý do này NHibernate cắt ngắn miliseconds khi lưu vào cửa hàng. Điều này dẫn đến kiểm tra của tôi thất bại khi kiểm tra các trường tồn tại chính xác như .NET DateTime của tôi giữ miliseconds của nó nhưng DateTime retrived sau khi lưu đã mất miliseconds của nó và do đó hai không thực sự bằng nhau.
Để khắc phục vấn đề này tôi đã thêm các bản đồ sau đây để các đối tượng Foo:
public class FooMap : IAutoMappingOverride<Foo>
{
public void Override(AutoMapping<Foo> mapping)
{
mapping.Map(f => f.CreatedDateTime).CustomType("datetime2");
}
}
Tôi hiểu rằng bản đồ này làm cho NHibernate tồn các CreatedDateTime đến một loại SQL của datetime2, có thể lưu trữ chính xác đầy đủ mà một NET DateTime có thể. Điều này làm việc một điều trị và thử nghiệm bây giờ vượt qua.
Tuy nhiên với một đường chuyền đến một thất bại: thử nghiệm của tôi để kiểm tra việc xuất khẩu schema hiện không thành công với các lỗi sau:
System.ArgumentException : Dialect does not support DbType.DateTime2
Parameter name: typecode
với một chồng dấu vết của:
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)
Mã này sử dụng Đối tượng NHibernate.Tool.hbm2ddl.SchemaExport để gọi phương thức Execute.
Tôi đang sử dụng Fluent v1 và NHibernate v2.1.
Tôi cũng đã cố gắng lập bản đồ của tôi DateTime
để một dấu thời gian nhưng có thể thậm chí không được ánh xạ làm việc như chèn thất bại trong đó nêu:
Không thể chèn một giá trị rõ ràng vào một cột timestamp. Sử dụng INSERT
với danh sách cột để loại trừ cột dấu thời gian hoặc chèn DEFAULT
vào cột dấu thời gian.
Có ai biết cách để SchemeExport làm việc với datetime2
HOẶC làm cách nào để có được ánh xạ dấu thời gian hoạt động cho thuộc tính datetime
?
NHibernate không cắt ngắn mili giây vì máy chủ sql. Kiểm tra câu trả lời của tôi – Jaguar
Chỉ định thời gian khách hàng hoạt động cho tôi cũng như khi tôi sử dụng SQL Server. Cảm ơn vì điều đó! Nó không thành công với PostgreSQL, mặc dù, với "System.InvalidCastException: Không thể cast DateTime2 vào bất kỳ DbType hợp lệ" – Manfred