2011-04-04 10 views
6

I principianti di Entity Framework, quindi per favore abbiate pazienza con me ...La relazione tra i due oggetti non può essere definito, perché sono attaccati alla diversa ObjectContext oggetti MVC 2

Come posso riguardano due oggetti da contesti diversi insieme?

L'esempio seguente genera la seguente eccezione:

System.InvalidOperationException: Il rapporto tra i due oggetti non può essere definito perché sono attaccati a diversi oggetti ObjectContext.

[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));    
    } 

Ho letto un sacco di messaggi relativi a questa eccezione, ma nessuno mi dia una risposta di lavoro ...

risposta

7

I suoi vari repository _userRepository, _blogEntryRepository, _tagRepository sembrano avere tutto loro ObjectContext. Si dovrebbe refactoring questo e creare l'ObjectContext al di fuori dei repository e poi iniettare come parametro (per tutti i repository lo stesso ObjectContext), in questo modo:

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

aggiunta alla @ risposta di Slauma: Non è possibile riferirsi oggetti attaccati in diversi contesti. L'unico modo è staccare un oggetto dal primo contesto e collegarlo al secondo. È molto più complesso della semplice condivisione del contesto tra i repository. –

Problemi correlati