2009-12-22 32 views
7

Tôi có 2 bảng, Bảng 1 có khóa chính 'CustomizationId' và Bảng 2 có tùy chỉnh FK phù hợp với điều này. Bảng 2 không có khóa chính.Làm cách nào để bạn cập nhật bảng bằng khóa ngoài thành bảng khác trong Mô hình thực thể ADO.Net?

Tôi đang cố thêm bản ghi mới từ biểu mẫu dựa trên web. Tôi cố lưu dữ liệu này vào cơ sở dữ liệu và tôi gặp lỗi:

  Customization customization = new Customization(); 
      Code code = new Code(); 
      customization.Name = CustomizationName.Text;    
      customization.LastUpdated = DateTime.Now; 

      code.Top = top_js.InnerText; 
      code.Bottom = bottom_js.InnerText; 

      //code.CustomizationId = customization.CustomizationId; 

      customization.Code = code;    
      entities.AddToCustomizations(customization); 
      entities.SaveChanges(); 

Khi tôi gọi SaveChanges Tôi gặp lỗi, có hay không tôi thêm vào dòng nhận xét.

Unable to update the EntitySet 'Code' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. 

Tôi xử lý tình huống này như thế nào? Tôi chỉ muốn thêm mã vào cùng một thời điểm mà tôi thêm vào Tùy chỉnh. Bảng 'Mã' phải có tập Customizationid được đặt thành PK/Identity được đặt theo Tùy chỉnh.

Bất kỳ ý tưởng nào?

Trả lời

7

Theo như EF quan tâm, bảng không có PK là Chế độ xem.

Điều này có nghĩa bạn có hai lựa chọn:

  1. Hãy nói một chút lời nói dối trắng, và thuyết phục EF rằng 'view' is a table
  2. Add modification functions (Insert/Update/Delete) để bạn có thể chỉnh sửa chúng.

Nói chung các chức năng điều chỉnh được lưu trữ thủ tục, nhưng bạn thực sự có thể thêm T-SQL trực tiếp đến SSDL nếu bạn không có quyền truy cập vào cơ sở dữ liệu ...

Tức là một cái gì đó như thế này trong các yếu tố <StorageModel> của EDMX cho mỗi hành động (chèn, cập nhật và xóa):

<Function Name="InsertCode" BuiltIn="false" IsComposable="false" > 
     <CommandText> 
       INSERT dbo.TCode(ID, Name) VALUES (@ID, @Name) 
     </CommandText> 
     <Parameter Name="ID" Type="int" Mode="In" /> 
     <Parameter Name="ID" Type="nvarchar(max)" Mode="In" /> 
</Function> 

Khi bạn có các chức năng điều chỉnh trong SSDL của bạn, bạn cần phải map them sao cho EF sử dụng chúng theo yêu cầu.

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

Hy vọng điều này sẽ hữu ích.

Chúc mừng Alex

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