Como garantir que os proxies sejam criados ao usar o padrão de repositório com a estrutura de entidade?
Eu tenho esse método na minha classe 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);
}
O GetPropertiesTable exibe novamente as Propriedades, mas PropertySurvey.Property é marcado como virtual e eu criei a entidade usando o novo operador, portanto, um proxy para oferecer suporte a carregamento lento nunca foi criado e é nulo quando eu o acesso. Quando temos acesso direto ao DbContext, podemos usar o método Create paracrie explicitamente o proxy. Mas eu tenho uma unidade de trabalho e padrão de repositório aqui. Eu acho que poderia expor o contexto.Criar método através de um repositório.Criar método e, em seguida, preciso lembrar de usar isso em vez do novo operador quando eu adicionar uma entidade. Mas não seria melhor encapsular o problema no meu método InsertOrUpdate? Existe alguma maneira de detectar que a entidade que está sendo adicionada não é um proxy quando deveria ser e substituir um proxy? Este é o meu método InsertOrUpdate na minha classe de repositório 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;
}
}