我在我的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的新手
更新
如果从控制器运行,所有查询都可以正常运行,但如果从类文件运行,则会出现“对象引用未设置为对象实例”错误
答案 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();
}
}
}
更好的方法是使用依赖注入将会话作为构造函数参数传递,但上述内容应该适合您。