10

Tôi đang chuyển cơ sở dữ liệu của sản phẩm sang SQLite từ một sản phẩm khác có hỗ trợ Hướng dẫn. Như chúng ta đã biết, SQLite không hỗ trợ các hướng dẫn. Tôi đã tạo ra một mô hình khung thực thể 6 từ cơ sở dữ liệu của tôi (cơ sở dữ liệu đầu tiên) và tôi cần xây dựng một truy vấn từ C# để so sánh Hướng dẫn với một từ được truyền từ mã.Nhà cung cấp SQLite Entity Framework 6 xử lý các hướng dẫn như thế nào?

Điều tôi không thể tìm thấy bất kỳ tài liệu nào về cách nhà cung cấp Khung thực thể SQLite xử lý các hướng dẫn. Một tìm kiếm trên web cũng không tìm thấy gì hữu ích cho tôi. Chỉ cần câu hỏi về việc sử dụng Entity Framework với SQLite.

Ai có thể chỉ cho tôi tài liệu hướng dẫn hoặc có thể cho tôi biết cách làm việc với các hướng dẫn trong cơ sở dữ liệu SQLite thông qua mô hình EF6?

+0

SQLite không có loại cột GUID rõ ràng, nhưng lưu trữ chúng với mối quan hệ loại 'BLOB' hoạt động hoàn toàn tốt. Không biết nhiều về Entity Framework, nhưng có vẻ như converters type (ngoài enums) sẽ chỉ có trong EF 7. Nhưng GUID có một CTor từ mảng byte vv, vì vậy nó có thể khá đơn giản. – peterchen

+0

Tôi đang lưu trữ chúng dưới dạng BLOB trong mô hình của mình, tuy nhiên, tôi gặp sự cố. Mã có một biểu thức tương tự như "ID == Guid ('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx') đang ném một ngoại lệ vì loại ID trong cơ sở dữ liệu là' Byte [] 'và điều bên phải Mã lệnh được đề cập phải chạy trên máy khách của chúng tôi (mã tôi đang làm việc) với SQLite và trên máy chủ của chúng tôi, nơi cơ sở dữ liệu là SQL Server. Chuỗi biểu thức không thể thay đổi. để làm điều gì đó ở phía SQLite để thực hiện công việc so sánh Tôi chỉ không biết cái gì Đó là lý do tại sao tôi tìm tài liệu –

+0

Trong SQLite, bạn có thể ghi đè lên hàm Guid(): https: // www. sqlite.org/c3ref/create_function.html (không chắc chắn cách hoạt động thông qua EF mặc dù) – peterchen

Trả lời

3

Tôi cuối cùng cũng có câu trả lời cho vấn đề này.

Vấn đề của tôi là nhà cung cấp SQLite Entity Framework 6 không xử lý chuyển đổi các hướng dẫn theo nghĩa đen trong mã của bạn thành SQL đúng cách. Đó là, một biểu thức LINQ có dạng

context.MyEntity.Where(x => x.GuidColumn == new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")) 

Gets chuyển thành SQL sau đây:

SELECT GuidColumn, Column1, Column2, . . . Column n 
FROM MyEntity AS Extent1 
WHERE Extent1.GuidColumn = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 

này là sai, vì giá trị được lưu trữ trong cột là một mảng byte.

Theo this problem report on the SQLite site, hóa ra là nhóm SQLite coi đây là lỗi trong nhà cung cấp và họ đang làm việc để sửa lỗi trong bản phát hành 1.0.95.0. Tôi không biết khi nào nó sẽ được phát hành, nhưng ít nhất họ nhận ra nó là một vấn đề và sẽ sửa chữa nó.

+0

Thats xấu .... chúng tôi đã quyết định để lưu trữ GUIDs như dây do vấn đề này – DarkWalker

+0

Trong khi tôi không còn ở công ty đó và không còn có quyền truy cập vào cơ sở mã đó, tôi nghĩ rằng những gì chúng tôi đã làm được đưa Guid vào một hướng dẫn biến & so sánh với điều đó. Như tôi đã nhớ, điều này được xử lý chính xác. –

10

Dường như điều này đã được giải quyết trong 1.0.95 nhưng lại bị hỏng trong 1.0.97. Giải pháp là đặt thuộc tính BinaryGUID trên chuỗi kết nối thành true và đặt biến môi trường sau (trước khi bạn thực hiện kết nối)

Environment.SetEnvironmentVariable ("AppendManifestToken_SQLiteProviderManifest", "; BinaryGUID = True;");

Nguồn dữ liệu = c: \ mydb.db; Phiên bản = 3; BinaryGUID = True;

https://www.connectionstrings.com/sqlite/

+1

Tôi đang sử dụng 1.0.97, nhưng thiết lập biến môi trường thực sự phá vỡ nó cho tôi. Tôi nhận được 'System.Data.Entity.Core.ProviderIncompatibleException: Nhà cung cấp đã không trả về một cá thể ProviderManifest.' và một ngoại lệ bên trong' System.ArgumentException: Một mục có cùng khóa đã tồn tại.'. Chỉ thay đổi chuỗi kết nối hoạt động tốt tuy nhiên. – Thorarin

+1

Bài đăng tuyệt vời! Điều này cố định vấn đề đối với tôi bằng cách sử dụng 1.0.99 và Entity Framework 6 – RichTurner

+0

BinaryGUID = True trong tập tin cấu hình là tất cả những gì tôi cần làm. – CrusherJoe

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