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 は仮想とマークされており、新しい演算子を使用してエンティティを作成したため、遅延読み込みをサポートするプロキシは作成されず、アクセスすると null になります。DbContext に直接アクセスできる場合は、Create メソッドを使用してプロキシを明示的に作成できます。しかし、ここには作業単位とリポジトリ パターンがあります。context.Create メソッドを repository.Create メソッドを介して公開できると思いますが、エンティティを追加するときに 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;
}
}