我的 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 重新显示属性,但 PropertySurvey.Property 被标记为虚拟,我使用 new 运算符创建了实体,因此从未创建支持延迟加载的代理,当我访问它时它为空。当我们可以直接访问 DbContext 时,我们可以使用 Create 方法显式创建代理。但是我在这里有一个工作单元和存储库模式。我想我可以通过 repository.Create 方法公开 context.Create 方法,然后我需要记住在添加 entity 时使用它而不是 new 运算符。但是将问题封装在我的 InsertOrUpdate 方法中不是更好吗?是否有某种方法可以检测到被添加的实体不是代理时应该是代理并替换代理?这是我的基础存储库类中的 InsertOrUpdate 方法:
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;
}
}