2010-04-29 38 views
18

Tôi có một cột như thế này trong 1 các bảng cơ sở dữ liệu của tôiLàm thế nào để quản lý getdate() với Entity Framework

DateCreated, datetime, default(GetDate()), not null 

Tôi cố gắng để sử dụng khung Entity để làm một chèn vào bảng này như thế này .. .

 PlaygroundEntities context = new PlaygroundEntities(); 

     Person p = new Person 
     { 
      Status = PersonStatus.Alive, 
      BirthDate = new DateTime(1982,3,18), 
      Name = "Joe Smith" 
     }; 

     context.AddToPeople(p); 
     context.SaveChanges(); 

Khi tôi chạy mã này tôi nhận được lỗi sau

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated. 

Vì vậy, tôi đã cố gắng thiết lập các StoreGenerat edPattern để tính ... cùng một điều, sau đó nhận dạng ... cùng một điều. Bất kỳ ý tưởng?

Trả lời

2

Thay đổi loại DateCreated thành datetime2 có thể giải quyết được sự cố.

datetime 2007-05-08 12: 35: 29.123

datetime2 2007-05-08 12:35:29. 12345

Ref: http://technet.microsoft.com/en-us/library/bb677335.aspx67

+0

giải quyết ngoại lệ, nhưng mặc định (GetDate()) không được gọi trên chèn. –

+0

thực sự, có vẻ như nó hoạt động, nhưng mã .net được đặt như datetime.minvalue theo mặc định. Có cách nào để ngăn chặn việc này không? –

+2

làm cho nó hoạt động bằng cách sử dụng tính toán storegeneratedpattern –

9

Bạn phải tự chỉnh sửa xml edmx và thiết lập SSDL StoreGeneratedPattern của bạn thuộc tính để nhận dạng hoặc tính toán. Nhưng bất cứ khi nào bạn cập nhật edmx của mình thông qua nhà thiết kế, các thay đổi của bạn sẽ bị ghi đè.

Đây là sự cố đã biết. Xin vui lòng xem các liên kết sau để biết thêm chi tiết:

Microsoft Connect Ticket

Using a GUID as an EntityKey in Entity Framework 4

+0

Visual Studio 2010 cho phép bạn thiết lập tính năng này ngay bây giờ mà không phải chỉnh sửa tệp edmx. – ICodeForCoffee

+0

@ICodeForCoffee như KenB đề cập, hiện tại có lỗi và cài đặt này trong giao diện người dùng Visual Studio không được áp dụng chính xác cho tệp .edmx. Thực sự gây phiền nhiễu :[ – RedFilter

2

Dưới đây là một cách giải quyết lao động:

1) Thay đổi cột để datetime2 như đã đề cập ở những nơi khác. Điều này khắc phục lỗi chuyển đổi.

2) Thêm trình kích hoạt đặt DateCreated thành getdate();

CREATE TRIGGER [TR_AS_ChangeTime] ON [AS_ApplicationSession] 
    AFTER INSERT,UPDATE AS 
BEGIN 

    SET NOCOUNT ON; 
    UPDATE AS_ApplicationSession 
    SET AS_ChangeTime = getdate() 
    WHERE AS_Id IN(SELECT AS_ID FROM INSERTED) 

END 

3) Nếu cần thiết, thiết lập

p.DateCreated = DateTime.MinValue; 

chỉ để khởi tạo nó.

4) Nếu bạn cần DateCreated từ cơ sở dữ liệu, thêm

context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p); 

ngay sau

context.SaveChanges(); 
4

tôi đã cùng một vấn đề! Đối với tôi nó hoạt động như thế này:

Cơ sở dữ liệu MS SQL Server bày tỏ:

[RowTime] [datetime2](7) NOT NULL 

ALTER TABLE [dbo].[Table_1] ADD CONSTRAINT [DF_Table_1_RowTime] DEFAULT (getdate()) FOR [RowTime] 
GO 

Sau đó, tôi nhập bảng từ cơ sở dữ liệu để mô hình thực thể của tôi. Thực thể sẽ không nhận ra giá trị mặc định! Vì vậy, bạn phải đặt StoreGeneratedPattern của cột thành Tính toán. Sau đó, các thực thể sẽ không đặt bất kỳ giá trị mặc định nào nữa.

Sự kết hợp của:

datetime2, 
NOT NULL, 
StoreGeneratedPattern=Computed 

trình cho tôi!

1

Tập trung vào thực tế là tôi không muốn thay đổi cơ sở dữ liệu, vì nó là một vấn đề ứng dụng và tôi hy vọng họ giải quyết vấn đề này một ngày, giải pháp của tôi (đó là hoàn toàn có thể trong trường hợp của tôi) là tạo ra một phần lớp của mô hình khắc phục sự cố trên constructor:

public partial class Log 
{ 
    public Log() 
    { 
     this.Date = DateTime.Now; 
    } 
} 

này làm việc cho tôi bởi vì:

  • tôi tạo ra các mô hình về thời điểm tôi gửi cho cơ sở dữ liệu.
  • Tôi sử dụng CLOUD cho các dịch vụ này, ngày giờ phải giống nhau trong cả máy chủ Ứng dụng và Cơ sở dữ liệu!

Đừng quên rằng không gian tên cần khớp với không gian tên Mô hình hoặc không nên liệt kê một phần thuộc tính (và cũng không nên là một phần;])!

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