2012-04-02 6 views
1

В Entity Framework 4.2 У меня есть объект Trips, который может иметь 0 .. * PlacesOfInterest и 0 .. * Photos. Достопримечательности 1 Поездка и 0 .. * Фотографии. Фотографии имеют 1 поездку и 0,1 достопримечательности.Тернарные отношения в Entity Framework

Когда я пытаюсь добавить фото, я использую этот метод:

public static Guid Create(string tripId, Model.Photo instance) 
    { 
     var context = new Model.POCOTripContext(); 
     var cleanPhoto = new Model.Photo(); 
     cleanPhoto.Id = Guid.NewGuid(); 
     cleanPhoto.Name = instance.Name; 
     cleanPhoto.URL = instance.URL; 
     //Relate the POI 
     cleanPhoto.PlaceOfInterest = Library.PlaceOfInterest.Get(instance.PlaceOfInterestId); 
     context.PlacesOfInterest.Attach(cleanPhoto.PlaceOfInterest); 
     //Relate the trip 
     cleanPhoto.Trip = Library.Trip.Get(new Guid(tripId)); 
     context.Trips.Attach(cleanPhoto.Trip); 
     //Add the photo 
     context.Photos.AddObject(cleanPhoto); 
     context.SaveChanges(); 
     return cleanPhoto.Id; 
    } 

Когда я проверить это, я получаю, когда Trip прилагается:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. 

Поездка действительно кажется в объекте context, но PlacesOfInterest делает это еще до утверждения Attach. Я не понимаю, как это работает, может кто-то уточнить?

EDIT: Вот POI и Trip Геттеры

public static Model.Trip Get(Guid tripId) 
    { 
     using (Model.POCOTripContext context = new Model.POCOTripContext()) 
     { 
      var tripEntity = context.Trips.Include("PlacesOfInterest").Include("PlacesOfInterest.PoiAttributes").Include("Photos").FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip(); 
      return tripEntity; 
     } 
    } 

    public static Model.PlaceOfInterest Get(Guid poiId) 
    { 
     using (Model.POCOTripContext context = new Model.POCOTripContext()) 
     { 
      var poiEntity = context.PlacesOfInterest.Include("PoiAttributes").FirstOrDefault(c => c.Id == poiId) ?? new Model.PlaceOfInterest(); 
      return poiEntity; 
     } 
    } 

Благодаря

S

+0

Я не думаю, что вам нужно снова прикрепить связанные элементы (я считаю, что Приложить вызов является излишним, пока соответствующие элементы уже прикреплены через сеттеры). Вы пробовали без Attach? –

+0

Да, затем он пытается вставить. См. Этот вопрос: http://stackoverflow.com/questions/9915216/why-does-adding-a-child-element-to-my-entity-framework-try-and-insert-a-new-pare –

+0

Можете ли вы показать код в 'Library.Trip.Get (...)' и 'Library.PlaceOfInterest.Get (...)'? – Slauma

ответ

1

Это ...

context.Trips.Include("PlacesOfInterest").... 

... загрузит PlacesOfInterest с поездка. Когда вы присоедините поездку к другому контексту trip.PlacesOfInterest, прикрепите его. Поскольку вы уже прикрепляли до PlaceOfInterest (который имеет идентификатор PlaceOfInterest в коллекции), вы прикрепляете два объекта одного типа с одним и тем же ключом. Это вызывает исключение.

Вы действительно можете упростить свой код: вам не нужно загружать объекты, потому что у вас есть их первичный ключ. Тогда вы можете просто создать новые экземпляры с помощью этого ключа и прикрепить его:

cleanPhoto.PlaceOfInterest = new PlaceOfInterest 
          { Id = instance.PlaceOfInterestId }; 
context.PlacesOfInterest.Attach(cleanPhoto.PlaceOfInterest); 

cleanPhoto.Trip = new Trip { Id = new Guid(tripId) }; 
context.Trips.Attach(cleanPhoto.Trip); 
+0

Отлично, спасибо! Я что-то узнал! –

Смежные вопросы