2010-11-13 31 views
8

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; } 
} 
+1

bạn có thể hiển thị mã nơi bạn liên kết ContactOption với UserContact –

+0

Justin, tôi đã cập nhật câu hỏi theo yêu cầu. Cảm ơn! –

Trả lời

2

tôi chạy mã của bạn và nhận được kết quả mong đợi chính xác: Một hàng mới trong UserContacts bảng với UserId hiện có và ContactOptionId, vì vậy tôi không chắc chắn những gì đang happing trong đó, nhưng bạn có thể cố gắng để có một cách rõ ràng FKS trong Đối tượng UserContact để bạn có toàn quyền kiểm soát cách Code First chèn các bản ghi cho bạn. Cho rằng, bạn cần phải thay đổi UserContact như sau:

public class UserContact 
{ 
    public int Id { get; set; } 

    // By Convention these 2 properties will be picked up as the FKs: 
    public int UserId { get; set; } 
    public int ContactOptionId { get; set; } 

    [Required] 
    public User User { get; set; }   
    [Required] 
    public ContactOption ContactOption { get; set; } 

    public string Data { get; set; } 
} 

Và sau đó bạn có thể thay đổi mã của bạn như thế này:

var contactOption = _context.ContactOptions.Find(someId); 
var user = _context.Users.Find(1); 

var contact = new UserContact 
{ 
    ContactOptionId = contactOption.Id, 
    UserId = user.Id, 
    Data = "someData" 
}; 

user.UserContacts.Add(contact); 
context.SaveChanges(); 
+0

Tôi không biết có đánh dấu câu trả lời của bạn là chính xác hay không. Nó đã giúp dẫn tôi xuống nơi tôi cần phải đi, nhưng tôi đã không giải quyết nó theo cách bạn đã làm. Vấn đề của tôi hóa ra là tôi có hai bối cảnh bởi vì trong ModelBinder của tôi, tôi đã xoay vòng một kho lưu trữ mới. Tôi cố định nó với một số DI goodness và vấn đề của tôi là tốt ngay bây giờ! –

+0

Cảm ơn bạn đã cập nhật của bạn và có, tôi biết rằng vấn đề là ở một nơi khác kể từ khi tôi nói, tôi theo nghĩa đen sao chép dán mã của bạn và nó làm việc như mong đợi đối với tôi. Ý định của tôi bằng cách đăng câu trả lời này là cho bạn thấy cách chúng tôi có thể loại bỏ các FK rõ ràng, để chúng tôi không bị ràng buộc với bất kỳ quy ước đầu tiên nào nữa và chúng tôi có thể đảm bảo rằng mã sẽ hoạt động theo cách chúng tôi muốn nó hoạt động. –

+0

Tôi sẽ đánh dấu câu trả lời của bạn là chính xác vì nó đã giúp tôi. Tôi cũng sẽ chỉnh sửa câu hỏi của mình để chỉ ra rằng việc tạo ra hai ngữ cảnh là vấn đề của tôi. –

1

Vấn đề của tôi hóa ra là có hai của bối 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. Nhờ Morteza Manavi đã chỉ cho tôi đúng hướng.

+0

Không có vấn đề và cảm ơn cho việc cập nhật. –

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