Jak upewnić się, że proxy są tworzone przy użyciu wzorca repozytorium z ramką encji?
Mam tę metodę w mojej klasie SurveyController:
public ActionResult AddProperties(int id, int[] propertyids, int page = 1)
{
var survey = _uow.SurveyRepository.Find(id);
if (propertyids == null)
return GetPropertiesTable(survey, page);
var repo = _uow.PropertySurveyRepository;
propertyids.Select(propertyid => new PropertySurvey
{
//Setting the Property rather than the PropertyID
//prevents the error occurring later
//Property = _uow.PropertyRepository.Find(propertyid),
PropertyID = propertyid,
SurveyID = id
})
.ForEach(x => repo.InsertOrUpdate(x));
_uow.Save();
return GetPropertiesTable(survey, page);
}
Funkcja GetPropertiesTable ponownie wyświetla właściwości, ale właściwość PropertySurvey.Property jest oznaczona jako wirtualna, a ja utworzyłem obiekt za pomocą nowego operatora, więc serwer proxy obsługujący leniwe ładowanie nigdy nie został utworzony i jest zerowy, gdy uzyskuję do niego dostęp. Kiedy mamy bezpośredni dostęp do DbContext, możemy użyć metody Create dojawnie utwórz proxy. Ale mam tutaj jednostkę pracy i wzór repozytorium. Zgaduję, że mogę ujawnić metodę context.Create za pomocą metody repository.Create, a następnie muszę pamiętać, aby użyć tego zamiast nowego operatora, gdy dodam obiekt. Ale czy nie lepiej byłoby ująć problem w mojej metodzie InsertOrUpdate? Czy jest jakiś sposób na wykrycie, że dodawana jednostka nie jest serwerem proxy, kiedy powinna i zastępuje proxy? To jest moja metoda InsertOrUpdate w mojej podstawowej klasie repozytorium:
protected virtual void InsertOrUpdate(T e, int id)
{
if (id == default(int))
{
// New entity
context.Set<T>().Add(e);
}
else
{
// Existing entity
context.Entry(e).State = EntityState.Modified;
}
}