2009-06-01 56 views
25

Tôi đang gặp sự cố với các khóa chính trong Khuôn khổ thực thể khi sử dụng SQLite. SQLite muốn một NULL rõ ràng trong danh sách VALUES trên một cột khóa tự động chính. Tôi đã không thực sự nhìn vào SQL tạo ra trong bối cảnh EF, nhưng tôi tin rằng nó đi với quy ước SQL Server thông thường của việc cung cấp không có giá trị cho cột autoincrementing.SQLite với Entity Framework

Theo số site cho nhà cung cấp ADO.NET SQLite, EF được hỗ trợ đầy đủ nhưng tôi không tìm thấy trợ giúp ở đó. Có cách nào để buộc EF để chèn một NULL cho giá trị khóa chính?

+0

Tôi đang ở trong cùng một tình huống. Tôi đã thử thay thế lâu dài? trong mã được tạo ra, vì vậy tôi có thể ít nhất thiết lập bản thân null, nhưng nó không hoạt động. Thông báo lỗi: "Các thay đổi đối với cơ sở dữ liệu đã được thực hiện thành công, nhưng đã xảy ra lỗi trong khi cập nhật bối cảnh đối tượng. ObjectContext có thể ở trạng thái không nhất quán. Thông báo ngoại lệ bên trong: Cặp khóa-giá trị xác định EntityKey không thể là rỗng hoặc trống. \ r \ n Tên tham số: bản ghi ". Có vẻ như theres không có cách nào để bỏ qua này, cách xử lý sqlite autoincrement là kinda wierd. – Pablote

+0

Tôi đã từ bỏ SQLite kết hợp với EF. Có một bài viết về vấn đề này rất lớn trên các diễn đàn tại trang web cho System.Data.Sqlite nhưng không có chuyển động hoặc phản ứng trong một thời gian. Tôi chuyển sang SQL Compact, trình bày các vấn đề của riêng nó. Bạn không thể làm "các khóa do máy chủ tạo" với EF/SQLCompact. Vì vậy, bây giờ tôi làm tiêu chuẩn kết nối/Command-phong cách ADO cho chèn và tôi đang sử dụng EF cho đường LINQ. –

+0

Điều này thật tệ. Tôi đoán cùng một 'thủ thuật' có thể được sử dụng trong sqlite. Tôi đã thử nghiệm autoincrement với CE và LINQ để sql và nó có vẻ làm việc. Đã không thử nó với sqlite, không chắc chắn nếu nó thậm chí có thể. – Pablote

Trả lời

18

Cuối cùng tôi cũng đã thực hiện công việc này: D. Bạn cần phải thiết lập cột id là autoincrement, theo cách này nó làm việc với EF. Không hỏi tôi tại sao điều này không được đề cập trong câu hỏi về tự động tăng trong sqlite faq. Đây là một ví dụ:

create table Persona (PersonaID integer primary key autoincrement, Nombre text) 

Ngoài ra, tôi không tìm cách thiết lập điều này từ trong studio trực quan, tôi phải làm điều đó từ công cụ dòng lệnh.

CẬP NHẬT: Mã sau hoạt động tốt.

PruebaDBEntities data = new PruebaDBEntities(); 

     foreach (int num in Enumerable.Range(1, 1000)) 
     { 
      Persona p = new Persona() { Nombre = "Persona " + num, Edad = num }; 

      data.AddToPersona(p); 

      data.SaveChanges(); 

      Console.WriteLine(p.PersonaID); 
     } 

PersonaID không được đặt và sau thao tác lưu nó có giá trị được gán bởi sqlite.

+0

Tôi thấy rằng trong một số bài đăng, nhưng bạn không phải nhập NULL một cách rõ ràng trong câu lệnh INSERT cho khóa chính không? "INSERT INTO Persona VALUES ('Pablo')" không hoạt động, bạn phải làm "INSERT INTO Persona VALUES (NULL, 'Pablo')" phải không? –

+0

Tôi đã trả lời bài đăng, vì vậy mã có thể được định dạng độc đáo. – Pablote

+0

+1 Cảm ơn bạn đã làm việc cho tôi. – IamStalker

3

Tôi đã gặp vấn đề tương tự với EF và SQLite. Thử kiểm tra bài đăng thứ hai: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

Nguyên nhân cho sự cố của tôi là tự động thêm vào cơ sở dữ liệu, nhưng mô hình thực thể không được làm mới đúng cách. Vì vậy, sau khi làm mới, lĩnh vực của tôi trông như thế này:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" /> 

(StoreGeneratedPattern = "Identity" đã được bổ sung)

Trước khi refresh (với mô hình cũ), tôi chỉ cố gắng thiết lập id thuộc tính cho 0, hoạt động tốt :)

12

Hoan hô ... Tôi đã tìm ra giải pháp!

  1. Khai báo cột ID là INTEGER PRIMARY KEY AUTOINCREMENT trong câu lệnh tạo bảng của bạn. INTEGER PRIMARY KEY sẽ không hoạt động!
  2. Cập nhật Entity Framework Model của bạn trong Visual Studio, thiết lập các StoreGeneratedPattern ID sở hữu cột để "Điện Toán"
+3

Tôi đã thực hiện bước đầu tiên của bạn, sau đó xóa và tạo ra mô hình EF của tôi. Đó là nó. Trên thực tế, StoreGeneratedPattern giờ đã được đặt thành "Identity". Nó đang làm việc bây giờ. – OneWorld

+1

Tôi cũng làm cho nó bay bằng cách đặt 'StoreGeneratedPattern' thành" Identity " – Christoph

1

Từ cuốn sách "The Definitive Guide để SQLite" Tôi đọc phần sau đây dưới chế khóa chính:

"Trong thực tế, tuy nhiên, cột này sẽ chỉ đơn giản là một bí danh cho ROWID. Tất cả chúng sẽ tham chiếu đến cùng một giá trị."

Tôi tin rằng đó là lý do cần đặt AUTOINCREMENT trong định nghĩa cột.

5

Bạn phải đặt autoincrement thành True. Bạn có thể thực hiện việc này trực tiếp từ VS bằng cách nhấp vào (Quản lý chỉ mục và phím) biểu tượng từ thanh công cụ trong khi bạn đang ở trong cửa sổ bảng thiết kế, sau đó cập nhật Mô hình của bạn.

image

0

Có vẻ như nhà cung cấp EF cho SQLite không nhấc cột như danh tính (autoincrement).

Đối với cơ sở dữ liệu đầu tiên, hãy nhấp chuột phải vào cột trong trình thiết kế EDMX và đặt StoreGeneratedPattern thành Identity.