Nó có một phần tử DefiningQuery nhưng không có phần tử Chèn


123

Điều này đang khiến tôi phát điên, và lỗi này khá vô nghĩa với tôi:

Không thể cập nhật Entityset 'TableB' vì nó có DefiningQuery và không có phần tử nào tồn tại trong phần tử để hỗ trợ hoạt động hiện tại.

Các bảng của tôi được đặt như thế này:

BảngA
int idA (danh tính, khóa chính)
...

BảngB
int idA (FK cho TableA.idA)
int val

TableB không có khóa chính được xác định trong máy chủ SQL. Entity Framework đã nhập bảng và liên kết và đặt cả hai trường làm khóa. Nhưng nó sẽ xuất ra lỗi đó khi tôi cố gắng chèn vào bảng!

Chuyện gì vậy??


Chỉnh sửa: Theo đề xuất của Alex, giải pháp là:

  1. Nhấp chuột phải vào tệp edmx, chọn Mở bằng, trình soạn thảo XML
  2. Xác định vị trí thực thể trong phần tử edmx: StorageModels
  3. Xóa hoàn toàn DefiningQuery
  4. Đổi tên cửa hàng: Schema = "dbo" thành Schema = "dbo" (nếu không, mã sẽ tạo ra lỗi cho biết tên không hợp lệ)
  5. Xóa cửa hàng: Tên tài sản

Tôi đã để lại chìa khóa, vì nó ổn với tôi rằng cả hai cột đều là một phần của khóa.


6
Cảm ơn bạn đã cập nhật - các hướng dẫn từng bước đã giúp cho newb EF này giúp ứng dụng hướng dẫn ASP.NET MVC hoạt động!
Adam Neal

Thnx cho điều này! Tôi gặp vấn đề là EF không tạo tệp edmx thích hợp cho bảng máy chủ sql 2000 có khóa chính. Nhưng hướng dẫn này đã cứu tôi :)
100r

4
3,5 năm sau, và bài đăng này vẫn giúp ppl, trong trường hợp này, TÔI! ... Tới: Palantir cho từng bước mô tả (nó hoạt động) và cảm ơn Alex >>> Bravo!
nanonerd

Giải pháp hiệu quả với tôi .. Cảm ơn
Delavega 16/11/13

Bí mật đã loại bỏ "store:" khỏi định nghĩa lược đồ. Rất đẹp
Guilherme Ferreira

Câu trả lời:


141

Chà, khi gặp phải một bảng mà không có Chính khóa, nó được coi là Chế độ xem.

Và các khung nhìn hiển thị trong tệp EDMX (mở trong trình soạn thảo XML để xem) trong phần tử StorageModel \ Entityset [n] \ DefiningQuery.

Khi bạn có DefiningQuery, Thực thể sẽ trở thành chỉ đọc trừ khi bạn thêm các hàm sửa đổi. Bạn cần 3 chức năng sửa đổi (còn gọi là Thủ tục lưu trữ) một cho mỗi chức năng Chèn, Cập nhật và Xóa.

Nhưng bạn có hai lựa chọn:

Thay đổi định nghĩa chính:

  1. Và thuyết phục EF rằng những gì nó nghĩ là một cái nhìn thực sự là một cái bàn
  2. Hoặc thêm các chức năng sửa đổi thích hợp

Trong trường hợp của bạn, tôi khuyên bạn nên (1).


Tôi đã gặp lỗi này khi tôi đang cố thêm một thực thể vào bảng nối. Đề nghị của bạn đã sửa nó, cảm ơn!
Walter Stabosz

thật tuyệt vời ..., Tnks
Mohan Gundlapalli

Đừng quên nhấp vào "Cập nhật mô hình từ cơ sở dữ liệu" trên tệp .edmx của bạn mà bạn đã tạo từ cơ sở dữ liệu trước tiên
Bashar Abu Shamaa

Tôi đang đối mặt với cùng một vấn đề, một phần lạ là, nó hoạt động tốt trong môi trường thử nghiệm và địa phương của chúng tôi, nó chỉ không hoạt động trên môi trường của khách hàng (buồn tẻ)
Mox Shah

13

Chỉ cần thêm một khóa chính vào bảng. Đó là nó. Vấn đề được giải quyết.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

6

Tôi đã thiếu một khóa chính trên bàn của tôi và nhận được thông báo lỗi này. Một điều tôi lưu ý là sau khi tôi thêm khóa vào bảng, tôi cần xóa bảng khỏi edmx bằng trình thiết kế, lưu edmx, sau đó cập nhật lại để thêm bảng trở lại. Nó không lấy khóa vì nó đã được chỉ định làm khung nhìn. Điều này không yêu cầu chỉnh sửa edmx bằng tay.


5

Thêm khóa chính vào bảng, xóa mô hình khỏi mô hình edmx, sau đó chọn cập nhật từ cơ sở dữ liệu, xây dựng và chạy ...... hoạt động


1

@Palantir. Xác minh rằng cả hai bảng của bạn đều được đặt Khóa chính và cẩn thận với nhiều khóa chính được đặt trong một bảng.


0
  1. Bạn cần mở thủ công tệp .EDMX trong notepad hoặc notepad ++ hoặc trong bất kỳ trình soạn thảo văn bản nào bạn chọn.
  2. Xác định vị trí mục trong edmx: StorageModels trong tệp được mở ở bước 1.
  3. Tìm phần tử DefiningQuery và xóa hoàn toàn thẻ này.
  4. Tìm cửa hàng: Schema = "dbo" to Schema = "dbo" (nếu bạn bỏ qua bước này, nó sẽ tạo ra lỗi của tên không hợp lệ).
  5. Lưu và đóng tập tin.

Hy vọng nó sẽ giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.