2013-03-06 29 views
18

Có thể đặt Global Entity Framework DbContext để sử dụng datetime2 cho tất cả các thuộc tính là System.DateTime khi sử dụng mô hình Code-First không?Force Entity Framework 5 để sử dụng kiểu dữ liệu datetime2

Tôi có thể làm điều này cho mỗi cột bằng cách sử dụng phương pháp HasColumnType(), nhưng đối với một codebase hiện tại, tôi muốn có giải pháp toàn cầu.

+0

Chỉ cần tò mò là tại sao bạn muốn làm điều này. Lý do tôi hỏi là nó là một lỗi rất phổ biến khi cố gắng cam kết một thực thể có một giá trị mặc định cho một cột DateTime không nullable (DateTime.MinVal). Ngoại lệ chỉ ra rằng bạn nên sử dụng một cột DateTime2, nhưng điều này chủ yếu là gây hiểu nhầm trừ khi bạn thực sự cần độ chính xác cao hơn. Bản sửa lỗi là gán giá trị không mặc định cho trường DateTime hoặc để xác định giá trị đó là không thể thực hiện được. Hi vọng điêu nay co ich. –

+0

@ w.brian 1) Chúng tôi có một bảng lưu trữ tác phẩm nghệ thuật và tác giả nơi cả hai có thể được tạo ra/sinh ra trước năm 1753 ... 2) Nếu điều này là có thể, nó sẽ là một thay thế cho xác nhận ngày tối thiểu cho nhau cánh đồng. 3) sự tò mò về kỹ thuật ... –

+0

Gotcha. Chỉ muốn chắc chắn rằng bạn đã không sủa cây sai như tôi ban đầu đã làm khi tôi chạy vào trường hợp ngoại lệ tôi đã lưu ý ở trên. –

Trả lời

25

Vì EF6 đã hết thời gian và câu hỏi này vẫn hiển thị trong tìm kiếm, đây là cách sử dụng quy ước tùy chỉnh để đặt loại SQL. Trong phương thức OnModelCreating trong lớp DbContext của bạn, hãy làm:

modelBuilder.Properties<DateTime>() 
    .Configure(c => c.HasColumnType("datetime2")); 
+0

Đây có phải là phương thức mới không? vì tôi nhận được thông báo lỗi này trên Update-Database: ALTER TABLE ALTER COLUMN Date không thành công vì một hoặc nhiều đối tượng truy cập vào cột này. – Jacob

+1

@ Jacob Bạn có nghĩa là nó sẽ hoạt động nếu bạn đã tạo cơ sở dữ liệu cho mô hình? Có, nhưng bạn phải nhớ tạo một di chuyển sau khi thêm quy ước vào OnModelCreating. Đây là cách tôi đã làm nó, vì vậy tôi biết nó hoạt động nếu được thực hiện đúng :) –

+1

Tôi đã có lỗi như là kết quả của các ràng buộc bảng. Tôi giải quyết nó bằng cách xóa chúng bằng tay theo câu trả lời này: https://stackoverflow.com/a/19461205/665783 Tuy nhiên, câu trả lời của bạn đã giúp chúng tôi rất nhiều. Chúng tôi đã di chuyển toàn bộ db của mình bằng mã bạn đã đăng. Cảm ơn bạn! – Jacob

7

Không có trong EF5 nhưng EF6 (hiện đang ở phiên bản alpha) cho phép điều này với custom conventions. Đối với EF5, bạn sẽ cần một số khung công tác dựa trên sự phản ánh sẽ bổ sung các cuộc gọi HasColumnType vào trình xây dựng mô hình thông qua sự phản ánh - ví dụ EF Code First Extras (nó tuyên bố có hỗ trợ cho các quy ước có thể cắm).

Các vấn đề liên quan