从RavenDB中选择值时出错
本文关键字:出错 选择 RavenDB | 更新日期: 2023-09-27 18:29:15
我在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();
}
}
}
激活.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 的新手
更新
如果从控制器运行,所有查询都可以正常工作,但如果从类文件运行,则会出现错误"Object reference not set to a instance of a Object"
如果您尝试安装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();
}
}
}
更好的方法是使用依赖注入将会话作为构造函数参数传递,但以上方法应该适用。