2010-10-15 9 views
5

System.DateTime có thể có phạm vi giá trị rộng hơn so với Ngày giờ của SQL Server. Do đó có lớp System.Data.SqlTypes.SqlDateTime bắt chước sau.Khuôn khổ thực thể và thực hành tốt nhất của SqlDateTime tràn

Do đó tôi đã mong đợi Khung thực thể chọn SqlDateTime, nhưng không.

Vì vậy, câu hỏi của tôi là ...

thực tiễn tốt nhất để bảo đảm rằng giá trị DateTime của bạn sẽ không gây ra vấn đề khi bạn cố gắng để lưu chúng vào cơ sở dữ liệu của bạn là gì?

Có cách nào buộc EF sử dụng SqlDateTime không?

Trả lời

4

Có một số điều bạn có thể làm:

  • nếu bạn đang sử dụng SQL Server 2008 hoặc mới hơn, bạn có thể sử dụng DATE hoặc DATETIME2 kiểu dữ liệu trên cơ sở dữ liệu trong đó cung cấp phạm vi ngày giống như .NET là DateTime

  • nếu bạn không thể sử dụng các loại dữ liệu mới, bạn có thể xử lý một số kiểm tra/xác thực trên các trường ngày trước khi mọi thứ được lưu trữ trong cửa hàng liên tục. EF EntityObject cung cấp nhiều cách để khai thác vào quá trình chứng thực và tiết kiệm đối tượng - chọn một cách tiếp cận phù hợp với mình

1

Có lẽ đây là một chủ đề cũ nhưng tôi sẽ đăng những phát hiện của tôi về vấn đề này cho những người khác:

Hãy nói rằng chúng ta có dev env: EF 5, CodeFirst, SqlCE 4.0:

public abstract class Entity : IEntity, IEquatable<Entity> 
{ 
public virtual int Id { get; protected set; } 
public virtual DateTime LastModified { get; set; } 

[DataType(DataType.Date)] 
public virtual DateTime CreatedOn { get; set; } 

[DataType(DataType.DateTime)] 
public virtual DateTime CreatedOn2 { get; set; } 

[DataType(DataType.Time)] 
public virtual DateTime CreatedOn3 { get; set; } 

public virtual DateTime CreatedOn4 { get; set; } 
} 

wi th như một ánh xạ tùy chỉnh:

public EntityMapping() 
{ 
HasKey(e => e.Id); 
Property(e => e.Id); 
Property(e => e.LastModified).IsRequired().IsConcurrencyToken(); 
Property(e => e.CreatedOn).IsRequired(); 
Property(e => e.CreatedOn2).IsRequired(); 
Property(e => e.CreatedOn3).IsRequired(); 
Property(e => e.CreatedOn4).IsRequired(); 
} 

Điều này tạo ra this, có nghĩa là chúng tôi sẽ có ngoại lệ tràn.

Thay đổi ánh xạ để điều này trong khi vẫn làm việc với SQL CE 4.0:

Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2"); 
Property(e => e.CreatedOn2).IsRequired().HasColumnType("date"); 
Property(e => e.CreatedOn3).IsRequired().HasColumnType("date"); 
Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2"); 

Cho error này. Chuyển sang SQL Server Standart 2012 dường như giải quyết vấn đề (Đó không phải là giải pháp chắc chắn - chỉ dành cho thử nghiệm). Lược đồ SQL Server đã tạo là this.

Tôi không phải là chuyên gia về Sql nhưng có vẻ như với tôi là SQL CE does not support these dates. vấn đề với env phát triển. vẫn còn. DateTime có thể được thay thế nhưng có thể mang lại rất nhiều refactoring ở đây và tehere.

Cũng nhớ rằng SqlDateTime and DateTime are very different. Giải pháp mà tôi thấy tốt - cho mã và vòng đời của dự án - là chuyển đổi giữa standart LocalDb và SQL như được đề xuất bởi một trong các liên kết ở trên từ stackoverflow kết hợp với các thiết lập bản đồ fluentApi tùy chỉnh để cân bằng việc tạo mô hình hoặc cả hai .

Giới thiệu custom convention in EF làm lưới an toàn cũng có vẻ tốt.

Nếu có ai có giải pháp toàn diện hơn, cho mã và cho cả hai sản xuất, hãy đăng nó lên.