¿Cómo garantizar que los proxies se crean cuando se usa el patrón de repositorio con el marco de la entidad?
Tengo este método en mi clase 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);
}
GetPropertiesTable vuelve a mostrar las Propiedades, pero PropertySurvey.Property se marca como virtual y he creado la entidad utilizando el nuevo operador, por lo que nunca se creó un proxy para admitir la carga diferida y es nulo cuando lo accedo. Cuando tengamos acceso directo a DbContext podemos usar el método Crear paracrear explícitamente el proxy. Pero tengo una unidad de trabajo y patrón de repositorio aquí. Supongo que podría exponer el contexto. Crear un método a través de un repositorio. Crear un método y luego debo recordar usar eso en lugar del nuevo operador cuando agrego una entidad. Pero, ¿no sería mejor encapsular el problema en mi método InsertOrUpdate? ¿Hay alguna manera de detectar que la entidad que se está agregando no es un proxy cuando debería serlo y sustituirlo por un proxy? Este es mi método InsertOrUpdate en mi clase de repositorio base:
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;
}
}