Vấn đề của tôi hóa ra là có hai ngữ cảnh. Tôi làm lại mã của tôi một chút để chỉ có một bối cảnh và vấn đề của tôi đã biến mất.Mã khuôn khổ thực thể Đầu tiên Nhiều người tạo nhiều hàng trùng lặp
Tôi có một Người dùng có danh sách UserContact tự có ContactOption. Nó khá đơn giản từ 1 đến nhiều, nhiều đến 1 với bảng UserContact ở giữa.
Nếu tôi kéo người dùng ra khỏi db và tạo UserContact mới, nhưng đặt ContactOption thành một mục hiện có (mà tôi đã rút khỏi db), khi tôi SaveChanges, khung thực thể tạo một ContactOption mới trong cơ sở dữ liệu về cơ bản là bản sao của một bản sao tôi đã thêm vào UserContact (với ngoại lệ là nó nhận được một id mới).
Tôi đã chiến đấu với điều này trong vài giờ và không thể tìm ra điều này. Bất kỳ ý tưởng?
Tôi đang sử dụng mẫu Kho lưu trữ cho các truy vấn cơ sở dữ liệu của mình, nhưng tôi đã đảm bảo rằng họ đang chia sẻ cùng một ngữ cảnh.
tôi kéo người dùng ra khỏi cơ sở dữ liệu với điều này:
var user = _context.Users.Include("UserContacts.ContactOption")
.Where(id => id == 1);
Và tùy chọn liên hệ được kéo ra với:
var co = _context.ContactOptions.FirstOrDefault(c => c.Id == id);
Và tôi thêm các ContactOption đến UserContact như vậy:
var contactOption = _context.ContactOptions.FirstOrDefault(c => c.Id == someId);
var contact = new UserContact { ContactOption = contactOption };
contact.Data = "someData";
user.UserContacts.Add(contact);
Mô hình của tôi trông giống như sau:
public class User
{
[Key]
public int Id { get; set; }
public virtual ICollection<UserContact> UserContacts { get; set; }
}
public class UserContact
{
[Key]
public int Id { get; set; }
[Required]
public User User { get; set; }
[Required]
public ContactOption ContactOption { get; set; }
public string Data { get; set; }
}
public class ContactOption
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
bạn có thể hiển thị mã nơi bạn liên kết ContactOption với UserContact –
Justin, tôi đã cập nhật câu hỏi theo yêu cầu. Cảm ơn! –