2011-07-21 18 views
24

Trong khi cập nhật với sự trợ giúp của LINQ to SQL bằng Entity Framework, một ngoại lệ được ném ra.Tại sao tôi nhận được một "Không thể cập nhật EntitySet vì nó có một DefiningQuery ..." ngoại lệ khi cố gắng cập nhật một mô hình trong khung thực thể?

System.Data.UpdateException: Unable to update the EntitySet 't_emp' because it has 
a DefiningQuery and no <UpdateFunction> element exists in the 
<ModificationFunctionMapping> 

Mã này để cập nhật là:

public void Updateall() 
    { 
     try 
     { 


      var tb = (from p in _te.t_emp 
         where p.id == "1" 
         select p).FirstOrDefault(); 
      tb.ename = "jack"; 

      _te.ApplyPropertyChanges(tb.EntityKey.EntitySetName, tb); 
      _te.SaveChanges(true); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

Tại sao tôi nhận được lỗi này?

Trả lời

51

vấn đề là trong cấu trúc bảng để tránh người erro r chúng ta phải tạo một khóa chính trong bảng. Sau đó, cập nhật edmx.Vấn đề sẽ được cố định

+0

Bạn đã tiết kiệm thời gian của mình! Cảm ơn bạn – Hamdi

+0

Thời gian của tôi quá, Cảm ơn bạn! – Bojangles

+0

vấn đề rất lạ! cảm ơn vì đã tiết kiệm thời gian. –

8

Ba điều:

  1. Đừng bắt ngoại lệ bạn không thể xử lý. Bạn đang bắt mọi ngoại lệ có thể, và sau đó không làm gì với nó (ngoại trừ nuốt nó). Đó là một điều xấu ™ Bạn có thực sự muốn âm thầm làm gì nếu bất cứ điều gì sai? Điều đó dẫn đến trạng thái hỏng mà khó gỡ lỗi. Không tốt.

  2. LINQ to SQL là ORM, cũng như Khuôn khổ thực thể. Bạn có thể sử dụng LINQ để cập nhật các đối tượng, nhưng bạn không sử dụng LINQ to SQL, bạn đang sử dụng Entity Framework (LINQ to Entities).

  3. Bạn đã thử giải pháp outlined here chưa? Ngoại lệ bạn đã đăng được cắt bớt, vì vậy tôi không thể chắc chắn nó giống hệt nhau (vui lòng cập nhật bài đăng của bạn nếu không), và nếu nó giống nhau, bạn có thể bình luận về việc các tác phẩm có hoạt động không bạn?

"[..] Entity Framework không biết liệu một cái nhìn nhất định là có thể cập nhật hay không, vì vậy nó cho biết thêm các yếu tố <DefiningQuery> để bảo vệ chống lại có nỗ lực để tạo ra khuôn khổ truy vấn đối với một cái nhìn không thể cập nhật.

Nếu xem bạn có thể cập nhật, bạn có thể chỉ cần loại bỏ các yếu tố <DefiningQuery> từ định nghĩa EntitySet cho tầm nhìn của bạn bên trong của phần StorageModel của .edm của bạn x và quá trình cập nhật thông thường sẽ hoạt động như với bất kỳ bảng nào khác.

Nếu chế độ xem của bạn không thể cập nhật, bạn sẽ phải tự cung cấp bản cập nhật logic thông qua "Bản đồ chức năng sửa đổi". Ánh xạ chức năng sửa đổi gọi một hàm được xác định trong phần StorageModel trong tệp .edmx của bạn. Chức năng đó có thể chứa tên và đối số đối với quy trình được lưu trữ trong cơ sở dữ liệu của bạn hoặc bạn có thể sử dụng "lệnh xác định" để viết câu lệnh chèn, cập nhật hoặc xóa trực tiếp trong định nghĩa hàm trong phần StorageModel . của .edmx bạn" (tôi nhấn mạnh, bưu định dạng cho rõ ràng và cho stack Overflow)

(Nguồn: "Mike" trên MSDN).

+0

Cảm ơn Cứu giúp. Vấn đề nằm trong cấu trúc bảng. Sau khi xác định khóa chính, sẽ không có bất kỳ ngoại lệ nào. –

+3

+1 cho lời khuyên không liên quan về các phương pháp hay nhất (Bad Thing). – Phil

+0

Đã xác nhận, cần PK trên bàn của bạn (một PK tổng hợp sẽ làm). Xóa DefiningQuery làm cho mọi việc trở nên tồi tệ hơn. – StuartLC

0

Nhưng bạn có thể đặt chính tiểu học ở mẫu nếu sử dụng MVC Asp.net

Chỉ cần mở model.edmx trong bảng của bạn, đi đến bất động sản lĩnh vực của bạn và thiết lập Entity Key = True

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