cuốn sách gpt4 ai đã làm

sql-server - Entity Framework 7 không thể chèn ngày giờ

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 13:53:30 27 4
mua khóa gpt4 Nike

Tôi đang sử dụng EntityFramework 7, beta7 và có các thực thể sau:

C#

Nhật ký lớp công khai
{
[Cột(TypeName="datetime")]
Ngày giờ công khai Ngày { được đặt;
...
}

SQL

TẠO BẢNG [dbo].[Nhật ký] (
[Ngày] [ngày giờ] KHÔNG NULL,
...
)

Sau đó tôi làm như sau:

db.Logs.Add(Nhật ký mới { Date = DateTime.UtcNow });
db.SaveChanges();

Điều này thành công trên Windows nhưng không thành công với mono trên debian. Cùng một máy chủ/cơ sở dữ liệu SQL. SQL được tạo như sau. Xin lưu ý rằng @p1 Sự khác biệt trong các loại và giá trị được trình bày:

Windows

exec sp_executesql N'SET NOCOUNT TẮT;
CHÈN VÀO [Nhật ký] ([Trình duyệt], [Ngày], [Ngoại lệ], [Địa chỉ máy chủ], [Cấp độ], [Logger], [Thông báo], [Chủ đề], [Url], [Tên người dùng])
ĐÃ CHÈN ĐẦU RA.[Id]
GIÁ TRỊ (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);
',N'@p0 nvarchar(max) ,@p1 datetime2(7),@p2 nvarchar(max) ,@p3 nvarchar(max) ,@p4 nvarchar(4000),@p5 nvarchar(4000),@p6 nvarchar( 4000),@p7 nvarchar(4000),@p8 nvarchar(max),@p9 nvarchar(max) ',@p0=NULL,@p1='2015-09-28 23:02:26.0367851',@p2=NULL,@p3=NULL,@p4=N'INFO',@p5=N' Fanatics.ConsoleApp.Program',@p6=N'Console app test',@p7=N'0',@p8=NULL,@p9=NULL
đi

Linux

exec sp_executesql N'SET NOCOUNT TẮT;
CHÈN VÀO [Nhật ký] ([Trình duyệt], [Ngày], [Ngoại lệ], [Địa chỉ máy chủ], [Cấp độ], [Logger], [Thông báo], [Chủ đề], [Url], [Tên người dùng])
ĐÃ CHÈN ĐẦU RA.[Id]
GIÁ TRỊ (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);
',N'@p0 nvarchar(4000), @p1 char(27), @p2 nvarchar(4000), @p3 nvarchar(4000), @p4 nvarchar(4000), @p5 nvarchar(4000), @p6 nvarchar( 4000), @p7 nvarchar(4000), @p8 nvarchar(4000), @p9 nvarchar(4000)',@p0=NULL,@p1='2015-09-28T23:03:21.5561720',@p2=NULL,@p3=NULL,@p4=N'INFO' ,@p5=N'Fanatics.ConsoleApp.Program',@p6=Ứng dụng N'Console test',@p7=N'0',@p8=NULL,@p9=NULL
đi

Lỗi trên Linux là:

Chuyển đổi không thành công khi chuyển đổi ngày và/hoặc thời gian từ chuỗi ký tự.

câu hỏi

  1. Khi loại được đặt rõ ràng thành ngày giờ Tại sao Windows tạo ra ngày giờ2?
  2. Phiên bản Linux đang tạo SQL không hợp lệ và do đó không thành công. Cách chèn trên mono/linux ngày giờ 值?

câu trả lời hay nhất

  1. Loại .NET DateTime rộng hơn loại "datetime" của SQL Server. Trên thực tế, .NET DateTime có cùng phạm vi với loại "datetime2" của máy chủ sql, đó là lý do tại sao Entity Framework sẽ sử dụng datetime2 ở mọi nơi (nếu có thể) khi chuyển đổi DateTime thành ngày sql (như ví dụ của bạn). Trong trường hợp này, loại cột của bảng không quan trọng. bạn có thể đọc cái nàybiên bản cuộc họp thiết kếNhóm EF đã thảo luận về vấn đề datetime và datetime2 và quyết định giữ nguyên (và lý do đằng sau nó).

  2. Mono sử dụng TDS để làm việc với máy chủ sql (dựa trên TDS miễn phí , đang sử dụng một phiên bản khá lỗi thời. Phiên bản này không biết loại máy chủ sql "datetime2", vì vậy thay vì nâng cấp lên phiên bản TDS mới (có thể khối lượng công việc hiện tại quá nhiều), tôi đã triển khai một số loại hack để chuyển đổi datetime2 từ \ sang một chuỗi. Hiện tại, datetime2 có độ chính xác cao hơn datetime nên khi chuyển đổi datetime2 thành chuỗi rồi chuyển đổi chuỗi đó thành datetime (thực hiện ngầm) sẽ gây ra lỗi bạn nhìn thấy. Điều này rất dễ kiểm tra:

    chọn cast('2015-09-28T23:03:21.5561720' làm datetime2) -- < tất cả đều ổn
    chọn cast('2015-09-28T23:03:21.5561720' làm datetime) -- < lỗi từ câu hỏi của bạn

    Bạn có thể đọc thêm về nó đây .

Bạn có thể hỏi liệu bạn có thể sử dụng EF với máy chủ sql trên mono không. Chà, bạn có thể giải quyết vấn đề bằng cách đặt ProviderManifestToken thành 2005 trong mô hình EF. Điều này sẽ làm cho EF hoạt động với máy chủ sql 2005 và không sử dụng datetime2 ở mọi nơi. Nhưng rõ ràng bạn sẽ mất các loại khác được thêm sau SQL Server 2005, chưa kể đó là một vụ hack bẩn.

Là một lưu ý phụ - tốt nhất là không thực hiện bất kỳ sự phát triển nghiêm túc nào trên mono bằng máy chủ sql. Nhà cung cấp máy chủ SQL ở dạng đơn có rất nhiều lỗi và lỗi ở trên là một trong những lỗi vô hại nhất. Nó có vấn đề về giá trị null, vấn đề tổng hợp kết nối (vấn đề này rất nghiêm trọng - nếu bạn hết thời gian kết nối nhóm kết nối - kết nối sẽ bị gián đoạn trong toàn bộ vòng đời và kết nốitất cảTất cả các truy vấn sẽ không thành công - nếu truy vấn của bạn hết thời gian trên nhóm kết nối, hãy xóa kết nối khỏi nhóm kết nối), v.v. Hầu hết các lỗi này đã được biết từ nhiều năm nhưng vẫn chưa được khắc phục. Nếu bạn có sự lựa chọn - chỉ cần sử dụng postgresql, nó miễn phí, thật tuyệt và tôi không gặp bất kỳ vấn đề nào với mono.

Về sql-server - Entity Framework 7 không thể chèn datetime, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/32833879/

27 4 0
Hồ Xil
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress