2011-12-14 11 views
36

Tôi đang cố gắng ánh xạ thuộc tính TimeSpan Code First đến máy chủ SQL. Mã đầu tiên có vẻ là tạo ra nó như là một thời gian (7) trong SQL. Tuy nhiên TimeSpan trong. Net có thể xử lý thời gian dài hơn 24 giờ và tôi cần phải lưu trữ lâu hơn 24 giờ cho độ dài sự kiện. Cách tốt nhất để xử lý điều này với Code First là gì.Làm cách nào để ánh xạ TimeSpan với hơn 24 giờ tới Mã máy chủ SQL trước?

Trả lời

33

Theo previous question của tôi về cách để lưu trữ TimeSpan trong SQL Tôi được khuyên là nên lưu nó như giây hoặc vé vv Cuối cùng tôi đã không bản đồ cột TimeSpan vì không có tương đương trong máy chủ SQL. Tôi chỉ đơn giản là tạo ra một lĩnh vực thứ 2 mà chuyển đổi TimeSpan để đánh dấu và lưu trữ trong DB. Sau đó, tôi đã ngăn lưu trữ TimeSpan

public Int64 ValidityPeriodTicks { get; set; } 

[NotMapped] 
public TimeSpan ValidityPeriod 
{ 
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); } 
    set { ValidityPeriodTicks = value.Ticks; } 
} 
+2

Cách tiếp cận này có thể dẫn đến các truy vấn tối ưu khi ai đó không biết hoặc quên rằng ValidityPeriod là thuộc tính Không được ánh xạ. Nếu nó được sử dụng trong một LINQ nơi truy vấn EF sẽ không phàn nàn, nó sẽ chỉ kéo bộ sưu tập và lặp lại nó. Vì lý do này, người ta có thể sử dụng bộ tiếp cận Get/Set thời trang cũ để làm rõ rằng chúng không nên được sử dụng trong các truy vấn. – StanislawSwierc

+0

Đồng ý, tôi đã điều chỉnh mã của mình trong giải pháp của mình để việc triển khai rõ ràng hơn. – GraemeMiller

+4

Sử dụng các phương pháp mở rộng để nhận hoặc đặt giá trị và sẽ có ít hiểu lầm hơn. – deerchao

1

Trước hết, MVC không liên quan gì đến vấn đề này. Nó hoàn toàn liên quan đến EF Code First và SQL Server vì vậy nó là một vấn đề DAL.

Một giải pháp có thể để cung cấp một loại cột tùy chỉnh trong cấu hình tổ chức của bạn, như thế này:

modelBuilder 
.Entity<MyClass>() 
.Property(c => c.MyTimeSpan) 
.HasColumnType("whatever sql type you want to use"); 
+0

Ok. Đó là loại sql bạn muốn sử dụng mà tôi quan tâm. Cách tiêu chuẩn để ánh xạ .Net TimeSpan đến một trường máy chủ SQL là gì. – GraemeMiller

+0

Tôi nghĩ rằng nó đã đủ rõ ràng. Tham số chuỗi của phương thức HasColumnType phải chứa kiểu SQL của bạn như bạn khai báo nó trong một kịch bản sql hoặc thiết kế bảng, như nvarchar (50) hoặc bit hoặc bất cứ thứ gì bạn cần và tương thích với kiểu dữ liệu .Net bạn đang sử dụng . Đối với loại chính xác để sử dụng trong trường hợp cụ thể của bạn, chỉ cần thử nghiệm. –

+5

Tôi biết cách thay đổi loại cột, đó không phải là vấn đề. Nó có vẻ giống như một bản đồ vấn đề hợp lý phổ biến .Net TimeSpan to SQL. Tôi muốn biết cụ thể về những gì cách tốt nhất để xử lý lưu trữ. Net TimeSpan để SQL server. – GraemeMiller

3

Theo tôi biết không có loại dữ liệu tương đương trong SQL Server cho TimeSpan của .NET. Trận đấu gần nhất là Thời gian, nhưng, như bạn đã chỉ ra, nó chỉ hỗ trợ các giá trị lên đến 24 giờ? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes.

Tài liệu MSDN sau đây mô tả số http://msdn.microsoft.com/en-us/library/bb386909.aspx này. Tôi giả định rằng vì không có giải pháp nào được liệt kê ở đó, nên hiện tại không thể.

+1

Vâng tôi không bao giờ tìm thấy cách xa câu trả lời của tôi. EF dường như đưa ra quyết định kỳ quặc để ánh xạ nó tới kiểu dữ liệu Thời gian Máy chủ SQL mà rõ ràng là không phù hợp – GraemeMiller