急切加载不包括我的存储库类的导航属性

时间:2012-04-30 22:28:53

标签: asp.net-mvc-3 entity-framework

我在我的知识库类中有以下方法,用于检索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

1 个答案:

答案 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不会返回相关对象。你必须单独处理这种情况(只有在不需要这种关系的情况下才有可能)。