2010-03-19 40 views
15

Tôi có một DB SQLite được thiết lập để khi tôi xóa một Person thì delete được xếp chồng lên nhau. Điều này làm việc tốt khi tôi tự xóa một người (tất cả các bản ghi tham chiếu đến PersonID sẽ bị xóa). Nhưng khi tôi sử dụng Entity Framework để xóa các Person tôi nhận được một lỗi:Vấn đề với việc xóa tầng bằng cách sử dụng Entity Framework và System.Data.SQLite

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Tôi không hiểu tại sao điều này xảy ra. Trình kích hoạt của tôi được đặt để xóa tất cả các đối tượng liên quan trước khi xóa đối tượng mà đối tượng được yêu cầu xóa.

Khi tôi đi vào trình chỉnh sửa mô hình và kiểm tra thuộc tính của mối quan hệ, nó không hiển thị hành động nào cho thuộc tính OnDelete. Tại sao cài đặt này không chính xác bằng cách kéo nó từ DB? Nếu tôi thay đổi giá trị này để Cascade mọi thứ hoạt động đúng, nhưng tôi không muốn dựa vào sự thay đổi thủ công này bởi vì nếu tôi làm mới mô hình của mình từ DB và nó sẽ mất nó.

Đây là SQL thích hợp cho các bảng của tôi.

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE 
) 
CREATE TABLE [Person] 
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 
) 

Trả lời

24

Tôi vừa giải quyết vấn đề chính xác này. Nó bật ra rằng khi tôi sử dụng EF để Update model from database... tùy chọn, nó đã không đúng quy tắc "Cascade" để xóa.

Hãy thử chuyển sang mô hình cơ sở dữ liệu EF của bạn, nhấp vào liên kết gây ra sự cố, sau đó đảm bảo rằng End1 OnDelete (có thể là End2, phụ thuộc vào lược đồ cơ sở dữ liệu) được đặt thành Cascade.

+0

Có cách nào để giải quyết nếu bạn nên cập nhật End1 hoặc End2? Hoặc là nó chỉ là thử và sai? –

+1

Nó phụ thuộc vào cách cơ sở dữ liệu của bạn được mô hình hoá.Nếu bạn có mối quan hệ một-nhiều, kết thúc 'một' sẽ được đặt thành' Cascade' – Omar

1

Nghe như lỗi nhà cung cấp cho tôi. Các tầng nên được lấy từ DB. Hãy thử nó với SQL Server; bạn sẽ thấy nó hoạt động ở đó. Bạn nên báo cáo điều này cho bất cứ ai đã viết nhà cung cấp SQLite của bạn.

+0

Tôi có thể xác minh rằng không chỉ (một) lỗi nhà cung cấp SQLite của nó. Việc thêm các thác không được phản ánh trong mô hình trong SQL Server trừ khi bạn loại bỏ toàn bộ mô hình và tạo lại. Đau đớn. – Andiih

+0

@Andiih, chỉ khi thực thể đã được thêm vào mà không có chúng (có lẽ là không chính xác) ngay từ đầu. Nhà thiết kế không ghi đè CSDL tùy chỉnh của bạn. Đó thực sự là một tính năng. –

+0

Vâng, tôi đã sai lầm trong thiết kế cơ sở dữ liệu. Tôi đã không tùy chỉnh CSDL. Có cách nào để buộc làm mới mà không xóa và thêm lại toàn bộ mô hình không? – Andiih

4

Tôi đã gặp sự cố tương tự với SQL Server. Khi tôi cố gắng cập nhật chế độ từ cơ sở dữ liệu, nó không nhận các quy tắc xếp tầng. Lưu ý rằng các quy tắc đã được thêm sau khi mô hình đã được tạo. Tôi thậm chí đã cố gắng xóa một bảng từ mô hình và thêm nó trở lại. Điều đó có tác dụng tương tự - không có quy tắc xếp tầng.

Tuy nhiên, khi tôi tạo một mô hình hoàn toàn mới với cùng một bảng chính xác, nó đã chọn các quy tắc xếp tầng. Vì vậy, giải pháp của tôi chỉ là xóa mô hình cũ và tạo một mô hình mới có cùng tên, v.v.

Tôi đoán là có sự cố với mô hình cập nhật từ quá trình cơ sở dữ liệu.

+1

Tôi có cùng vấn đề này với Sql Server –

+1

Tôi cũng có thể xác nhận cùng một vấn đề – Andiih

+0

Nhà thiết kế sẽ không bao giờ ghi đè lên CSDL hiện có. Bởi vì bạn thường muốn giữ các tùy chỉnh của mình. Trong trường hợp này, bạn không, nhưng đó không phải là trường hợp phổ biến. –

0

Bạn chỉ có thể sử dụng thuộc tính điều hướng mà không cần sử dụng thuộc tính khóa ngoài. Chuỗi xóa không giải quyết được sự cố trong mã vì đối tượng người của bạn sẽ không bị đánh dấu là đã xóa.

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