Wie kann sichergestellt werden, dass Proxys erstellt werden, wenn das Repository-Muster mit dem Entity Framework verwendet wird?
Ich habe diese Methode in meiner SurveyController-Klasse:
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);
}
In der GetPropertiesTable werden die Eigenschaften erneut angezeigt, aber PropertySurvey.Property ist als virtuell markiert, und ich habe die Entität mit dem neuen Operator erstellt. Daher wurde nie ein Proxy zur Unterstützung des verzögerten Ladens erstellt, und beim Zugriff ist er null. Wenn wir direkten Zugriff auf den DbContext haben, können wir die Create-Methode verwenden, umErstellen Sie den Proxy explizit. Aber ich habe hier eine Arbeitseinheit und ein Repository-Muster. Ich schätze, ich könnte die context.Create-Methode über eine repository.Create-Methode verfügbar machen, und dann muss ich daran denken, dies anstelle des neuen Operators zu verwenden, wenn ich eine Entität hinzufüge. Aber wäre es nicht besser, das Problem in meiner InsertOrUpdate-Methode zu kapseln? Gibt es eine Möglichkeit zu erkennen, dass die hinzugefügte Entität kein Proxy ist, wenn dies der Fall sein sollte, und einen Proxy zu ersetzen? Dies ist meine InsertOrUpdate-Methode in meiner Basis-Repository-Klasse:
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;
}
}