【问题标题】:Error in selecting value from RavenDB从 RavenDB 选择值时出错
【发布时间】:2016-02-09 01:26:25
【问题描述】:

我在我的 mvc4 项目中使用 RavenDB,将类对象存储到 RavenDB 时它工作正常,但在执行选择操作时会引发错误:

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

所有查询

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 的新手

更新

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

【问题讨论】:

  • 你说的“从类文件运行”是什么意思RavenSession 是否正确实例化?
  • RAVENSESSION 已正确实例化,但如果我从模型文件夹中的类运行查询,那么我没有工作,但如果从 Controller 运行,那么它工作正常

标签: c# linq ravendb


【解决方案1】:

如果您尝试实例化 var ctrl = new Activation(); 并执行 ctrl.validate(x); 它将无法工作,因为 OnActionExecuting 没有运行。该函数在处理请求时由 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();
      }
   }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多