从RavenDB中选择值时出错

时间:2013-08-28 11:39:49

标签: c# linq ravendb

我在我的mvc4项目中使用RavenDB将类的对象存储到RavenDB时工作正常但是在执行select操作时会抛出错误:

  

对象引用未设置为对象的实例

所有查询

RavenbaseController.cs

public class RavenBaseController : Controller
{
   public IDocumentSession RavenSession { get; protected set; }

   protected override void OnActionExecuting(ActionExecutingContext filterContext)
   {
      RavenSession = MvcApplication.Store.OpenSession("ravendbtesting");
   }

   protected override void OnActionExecuted(ActionExecutedContext filterContext)
   {
      if (filterContext.IsChildAction)
         return;

      using (RavenSession)
      {
         if (filterContext.Exception != null)
             return;

         if (RavenSession != null)
             RavenSession.SaveChanges();
      }
   }
}

Activation.cs

public class Activation : RavenBaseController
{
    public string tokenid { get; set; }

    public bool validate(string tid)
    {
        var query = from u in RavenSession.Query<Register>() where u.TokenId == tid select u;

        foreach (var v in query)
        {
            v.IsApproved = true;
        }

        RavenSession.SaveChanges();
        return true;
    }
}
尝试

查询

var results = from u in RavenSession.Query<Register>()
    where u.TokenId == tid
    select u;

var query= RavenSession.Query<Register>()
                                     .Where(x => x.TokenId == tid)
                                      .ToList(); 

我无法理解为什么它不起作用我是RavenDB的新手

更新

如果从控制器运行,所有查询都可以正常运行,但如果从类文件运行,则会出现“对象引用未设置为对象实例”错误

1 个答案:

答案 0 :(得分:0)

如果您尝试实现var ctrl = new Activation();ctrl.validate(x);,那么OnActionExecuting无法正常运行。{p>} MVC框架在提供请求时自动调用该函数,而不是在手动测试时调用。

由于MVC实际上在每个请求上实例化一个新的控制器,你应该将RavenSession初始化移动到构造函数,因为你似乎没有在请求上下文中使用任何信息:

public class RavenBaseController : Controller
{
   public IDocumentSession RavenSession { get; protected set; }

   public RavenBaseController()
   {
      RavenSession = MvcApplication.Store.OpenSession("ravendbtesting");
   }

   protected override void OnActionExecuted(ActionExecutedContext filterContext)
   {
      if (filterContext.IsChildAction)
         return;

      using (RavenSession)
      {
         if (filterContext.Exception != null)
             return;

         if (RavenSession != null)
             RavenSession.SaveChanges();
      }
   }
}

更好的方法是使用依赖注入将会话作为构造函数参数传递,但上述内容应该适合您。