2013-06-11 32 views
5

Khi tôi lưu thay đổi cơ sở dữ liệu, tôi đang chạy vào ngoại lệ sau đây:Entity Framework 6 Mã Đầu tiên giá trị datetime mặc định trên chèn

Cannot insert the value NULL into column 'Registered', table 
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls. 
INSERT fails. The statement has been terminated. 

Mã liên quan đầu tiên sở hữu mô hình trông như thế này:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime   Registered   { get; private set; } 

... và đây là lý do tôi nhầm lẫn: Theo tôi biết, bằng cách cung cấp chú thích [DatabaseGenerated(DatabaseGeneratedOption.Identity) Tôi đang sắp đặt Khung thực thể để tự động tạo trường (trong trường hợp này: Chỉ một lần tại thời điểm tạo .)

Vì vậy, tôi hy vọng sẽ có trường không bắt buộc (không bắt buộc), mà không có khả năng thay đổi trường theo cách thủ công khi EF đang chăm sóc.

Tôi đang làm gì sai?


Ghi chú:

  1. Tôi không muốn sử dụng thạo-API, như tôi muốn sử dụng POCOs.
  2. Thuộc tính defaultValueSql cũng không phải là một tùy chọn, bởi vì tôi cần phải dựa vào cơ sở dữ liệu được dành riêng cho dự án này (ví dụ: GETDATE()).
  3. Tôi đang sử dụng Entity Framework 6 alpha 3, Code First.
+0

Tự động tạo cũng là khóa chính của bạn? Nếu vậy, bạn sẽ cần chỉ định chú thích [key]. – Botonomous

+0

Không. Nó chỉ là một tài sản. – Atrotygma

+1

Tôi không tin rằng kiểu dữ liệu DateTime có hỗ trợ cho thuộc tính trường danh tính. – marcellscarlett

Trả lời

3

Hãy thử điều này:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime?   Registered   { get; private set; } 

Dấu chấm hỏi làm tài sản nullable

+0

Tôi đã thử giải pháp của bạn, nhưng có vẻ như nó không hoạt động, mặc dù nó cần. Bất cứ khi nào tôi tạo tập lệnh di chuyển, trường được đánh dấu là "nullable: false" trong tập lệnh.Ngay cả khi tạo cơ sở dữ liệu. Điều gì có thể sai? Bộ tư nhân? – Atrotygma

2

Kỹ thuật này hoạt động như một lĩnh vực readonly đó là vẫn kiên trì cơ sở dữ liệu. Khi giá trị được đặt, nó không thể (dễ dàng) được thay đổi bằng cách sử dụng mã. (Tất nhiên, bạn thay đổi setter thành public hoặc internal nếu cần.)

Khi bạn tạo một trường hợp mới của lớp sử dụng mã này Registered ban đầu sẽ không được đặt. Lần đầu tiên giá trị của Registered được yêu cầu, nó sẽ thấy rằng nó chưa được gán một và sau đó mặc định là DateTime.Now. Bạn có thể thay đổi điều này thành DateTime.UTCNow nếu cần.

Khi tìm nạp một hoặc nhiều thực thể từ cơ sở dữ liệu, Khung thực thể sẽ đặt giá trị là Registered, bao gồm private các thiết lập như thế này.

private DateTime? registered; 
[Required] 
public DateTime Registered 
{ 
    get 
    { 
     if (registered == null) 
     { 
      registered = DateTime.Now; 
     } 
     return registered.Value; 
    } 
    private set { registered = value; } 
} 
Các vấn đề liên quan