6

Tôi có một số bản ghi Phụ huynh đã được chèn vào cơ sở dữ liệu. Bây giờ tôi muốn thêm một số hồ sơ trẻ em. Để thực hiện điều này, tôi đi theo các bước sau:Chèn bản ghi vào bảng con khi bản ghi cha đã tồn tại bằng mã khung Entity trước tiên

  1. Lấy Phụ Huynh (A) ghi
  2. Tạo một bản ghi con (B) mới
  3. Thêm kỷ lục cha mẹ đối với tài sản của trẻ em Navigation. B.A = A
  4. Gọi SaveChanges.

Vấn đề là khi tôi làm điều này EF chèn một phụ huynh mới và sau đó thêm con với một khóa nước ngoài trỏ đến cha mẹ mới được chèn vào thay vì chỉ chèn con với ánh xạ tới cha mẹ hiện có. Tôi cũng đã kiểm tra khóa chính của cha mẹ khi lưu con và nó tồn tại trong cơ sở dữ liệu.

Lưu ý rằng tôi đang sử dụng danh tính được tạo cơ sở dữ liệu cho Cha mẹ và Trẻ em. Một điều tôi nhận thấy là nếu tôi thêm/Lưu phụ huynh và trẻ em từ cùng một đối tượng bối cảnh thì nó hoạt động tốt.

Cần khắc phục điều này càng sớm càng tốt. Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

Trả lời

18

Có, bạn phải sử dụng cùng ngữ cảnh cho thao tác đó. Đó là vấn đề. Nếu bạn không sử dụng cùng một ngữ cảnh, bạn phải tự kiểm soát đối tượng nào sẽ được chèn vào, cái nào được cập nhật và cái nào sẽ không bị sửa đổi. Trong kịch bản của bạn chuỗi có thể là:

context.Parents.Attach(parent); // just attach as unchanged 
context.Childs.Add(child); // add as inserted 
parent.Childs.Add(child); // make connection between existing and inserted object 
context.SaveChanges(); 

cách tiếp cận khác có thể là:

child.Parent = parent; 
context.Childs.Add(child); // both child and parent are marked as inserted!!! 
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged 
context.SaveChanges(); 
+1

Cách tiếp cận thứ hai phù hợp với tôi. Cảm ơn rất nhiều. – Amit

+0

Có cùng một vấn đề. Bạn có thể vui lòng xem: http://stackoverflow.com/questions/16131090/the-relationship-could-not-be-changed-the-foreign-key-properties-is-non-nulla/16131494?noredirect= 1 # comment23046042_16131494? Tôi nhận được 'MamConfiguration_V1' tại bối cảnh smae tôi lưu các thay đổi. Nó được gắn vào cùng một ngữ cảnh. Luồng: nhận được MamConfiguration_V1 với Id mà tôi nhận được trong giao diện người dùng (chế độ chỉnh sửa) -> gán tất cả các giá trị cho nó từ giao diện người dùng -> ghi đè \ add \ delete tham chiếu (điều hướng) 'MamConfigurationToBrowser_V1'. Điều đó có thêm thông tin không? –

+0

+1 Mỗi ngày tôi học điều gì đó mới mẻ và đây là giải thích tốt nhất cho vấn đề này mà tôi đã từng gặp. Cảm ơn bạn! –

0

Ngoài ra, trong trường hợp khi bạn có một cái gì đó như:

public class B 
{ 
[Key] 
public int Id {get;set;} 

public AId {get;set;} 

//... other properties here 

[ForeignKey("AId")] 
public virtual A ParentA {get;set;} 
} 

bạn chỉ có thể thiết lập các khóa ngoài cho mục nhập id hiện có trong DB mà không cần và để lại ParentA null và trên context.SaveChanges() nó sẽ hoạt động như mong đợi (không tạo một ID khác nhập trong DB).

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