2011-04-04 21 views
6

tôi mới bắt đầu để khuôn khổ tổ chức nào, vì vậy hãy chịu với tôi ...Mối quan hệ giữa hai đối tượng không thể được định nghĩa bởi vì chúng được gắn vào ObjectContext khác nhau đối tượng MVC 2

Làm thế nào tôi có thể liên hệ hai đối tượng từ những bối cảnh khác nhau cùng với nhau?

Ví dụ dưới đây ném ngoại lệ sau đây:

System.InvalidOperationException: Mối quan hệ giữa hai đối tượng không thể được định nghĩa bởi vì chúng được gắn liền với đối tượng ObjectContext khác nhau.

[OwnerOnly] 
    [HttpPost] 
    [ValidateInput(false)] 
    public ActionResult Create(BlogEntryModel model) 
    { 
     if (!ModelState.IsValid) 
      return View(model); 
     var entry = new BlogEntry 
     { 
      Title = model.Title, 
      Content = model.Content, 
      ModifiedDate = DateTime.Now, 
      PublishedDate = DateTime.Now, 
      User = _userRepository.GetBlogOwner() 
     }; 
     _blogEntryRepository.AddBlogEntry(entry); 
     AddTagsToEntry(model.Tags, entry); 
     _blogEntryRepository.SaveChange(); 
     return RedirectToAction("Entry", new { Id = entry.Id }); 
    } 

    private void AddTagsToEntry(string tagsString, BlogEntry entry) 
    { 
     entry.Tags.Clear(); 
     var tags = String.IsNullOrEmpty(tagsString) 
         ? null 
         : _tagRepository.FindTagsByNames(PresentationUtils.ParseTagsString(tagsString)); 
     if (tags != null) 
      tags.ToList().ForEach(tag => entry.Tags.Add(tag));    
    } 

Tôi đã đọc rất nhiều bài viết về ngoại lệ này nhưng không ai cho tôi một câu trả lời làm việc ...

Trả lời

7

kho khác nhau của bạn _userRepository, _blogEntryRepository, _tagRepository dường như có tất cả ObjectContext riêng của họ. Bạn nên cấu trúc lại này và tạo ObjectContext bên ngoài của kho và sau đó tiêm nó như một tham số (đối với tất cả các kho ObjectContext giống nhau), như vậy:

public class XXXRepository 
{ 
    private readonly MyObjectContext _context; 

    public XXXRepository(MyObjectContext context) 
    { 
     _context = context; 
    } 

    // Use _context in your repository methods. 
    // Don't create an ObjectContext in this class 
} 
+0

bổ sung @ câu trả lời Slauma: Bạn không có thể liên hệ các vật gắn liền đến các ngữ cảnh khác nhau. Cách duy nhất là tách một đối tượng khỏi ngữ cảnh đầu tiên và đính kèm nó vào đối tượng thứ hai. Nó phức tạp hơn nhiều sau đó chỉ đơn giản là chia sẻ bối cảnh giữa các kho lưu trữ. –

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