我在我的知识库类中有以下方法,用于检索Session
对象和关联的Medicine object
(通过使用.Include
定义Eager加载),如下所示: -
public Session GetSession(int id)
{
return entities.Sessions.Include(d => d.Medicine).FirstOrDefault(d => d.SessionID == id);
}
我调用上述存储库方法的操作方法如下所示: -
[HttpPost]
public ActionResult Delete(int id)
{
try
{
//string desc;
var s = repository.GetSession(id);
repository.DeleteSession(s);
repository.Save();
return Json(new { IsSuccess = "True", id = s.SessionID, description = s.Medicine.Name }, JsonRequestBehavior.AllowGet);
}
catch (ArgumentNullException)
//code goes here
我面临的问题是,在使用repository.Save();
物理删除对象后,我将无法从内存中访问Medicine navigation property
,并且将引发以下异常 NullReferenceException在description = s.Medicine.Name
上未被用户代码处理,而我可以访问即使在删除对象后仍可在内存中使用的s.SessionID
,这也意味着Session
被删除的对象没有Include
(没有急切加载)Medicine
导航属性!!!?
BR
答案 0 :(得分:1)
如果删除与另一个实体有关系的实体,Entity Framework将同时删除这些对象之间的关系。您可以通过在删除实体之前为Json结果创建对象来解决问题:
var s = repository.GetSession(id);
var result = new { IsSuccess = "True", id = s.SessionID,
description = s.Medicine.Name };
repository.DeleteSession(s);
repository.Save();
return Json(result, JsonRequestBehavior.AllowGet);
如果数据库中没有从会话到Medicine的引用,这当然没有用,因为Include
不会返回相关对象。你必须单独处理这种情况(只有在不需要这种关系的情况下才有可能)。