在这个问题中,我询问了NHibernate会话的生命周期.我正在使用桌面应用程序,但是客户端/服务器分离,所以结论是我将每个服务器请求使用一个会话,因为服务器端是所有NHibernate魔法发生的地方.
我现在的问题是如何处理它.在会话过早关闭时加载引用数据之前我遇到了问题.问题是我在调试时在引用的类上看到以下内容 - 因此引用的数据尚未加载:
base {NHibernate.HibernateException} = {"正在初始化[MyNamespace.Foo#14] - 无法初始化角色集合:MyNamespace.Foo.Bars,没有关闭会话或会话"}
根据我的理解,即使我提交了交易,它也不会加载所有内容.所以我已经知道我需要保持会话开放一段时间,但是多久了?
我的问题基本上是,如果我正确处理生命周期,或者我应该改变以正确的方向.老实说,我看不出这是怎么回事,所以我真正喜欢的是函数调用,以确保获取引用的数据.我没有使用延迟加载,所以我认为它们会立即加载..?
当前体系结构:使用执行事务的"服务行为"类.这是IDisposable,所以服务本身使用围绕它的using子句.NHibernateSessionFactory提供了一个静态工厂,因此将被重用.
// This is the service - the function called "directly" through my WCF service.
public IList<Foo> SearchForFoo(string searchString)
{
using (var serviceBehavior = new FooServiceBehavior(new NhibernateSessionFactory()))
{
return serviceBehavior.SearchForFoo(searchString);
}
}
public class FooServiceBehavior : IDisposable
{
private readonly ISession _session;
public FooServiceBehavior(INhibernateSessionFactory sessionFactory)
{
_session = sessionFactory.OpenSession();
}
public void Dispose()
{
_session.Dispose();
}
public IList<Foo> SearchForFoo(string searchString) …Run Code Online (Sandbox Code Playgroud) 我在我的一个项目(和ASP.NET MVC应用程序)中使用Fluent NHibernate,使用LINQ查询数据(使用LINQ到NHibernate库).
更改了对象名称以保护无辜者.
假设我在数据库(MySQL)中有以下类Foo,Bar,Baz及其相应的表.
Foo与Fluent映射中定义的Bar(表"FooBar")和Baz(表"FooBaz")有多对多的关系.因此,类接口定义如下:
public class Foo {
public virtual int id { get; set; }
public virtual string name { get; set; }
public virtual string email { get; set; }
public virtual IList<Bar> bars { get; set; }
public virtual IList<Baz> bazes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常标准的课程.我们可以看到一个Foo对象将有一个条形和bazes列表.
尝试执行LINQ查询时出现问题.
如果我这样做一个简单的查询,它工作正常(where子句不重要):
var foos = from foo in session.Linq<Foo>()
where email.equals("foo@bar.com")
select foo;
IList<Foo> listFoos = foos.ToList();
Run Code Online (Sandbox Code Playgroud)
这将返回一个Foos列表,其中填充了所有字段(id,name,email,bars,bazes).log4net显示NHibernate对集合执行单独的查询.
当我只想加载一些字段时出现问题.例如,我可能只想加载查询中的条形,而不是bazes.
此查询编译,但在运行时产生错误:
var foos = from foo in session.Linq<Foo>()
where …Run Code Online (Sandbox Code Playgroud) 我正在使用NHibernate + Fluent来处理我的数据库,我在查询引用其他数据的数据时遇到了问题.我的简单问题是:我是否需要在映射中定义一些"BelongsTo"等,或者仅在一侧定义引用就足够了(参见下面的映射示例)?如果是这样 - 怎么样?如果没有请继续阅读..看看这个简化的例子 - 从两个模型类开始:
public class Foo
{
private IList<Bar> _bars = new List<Bar>();
public int Id { get; set; }
public string Name { get; set; }
public IList<Bar> Bars
{
get { return _bars; }
set { _bars = value; }
}
}
public class Bar
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我已经为这些类创建了映射.这真的是我想知道我是否做对了.我是否需要从Bar("BelongsTo"等)定义一个回到Foo的绑定,还是一种方法?或者我是否需要在模型类中定义从Foo到Bar的关系等等?以下是映射:
public class FooMapping : ClassMap<Foo>
{
public FooMapping()
{
Not.LazyLoad();
Id(c => …Run Code Online (Sandbox Code Playgroud) 我正在用NHibernate创建一个简单的Windows窗体应用程序,我对我应该如何使用它感到有点困惑.引用手册:
ISession(NHibernate.ISession)
表示应用程序与持久性存储之间的对话的单线程,短期对象.包装ADO.NET连接.ITransaction的工厂.保存持久对象的强制(第一级)缓存,在导航对象图或按标识符查找对象时使用.
现在,假设我有以下情况:
我有一个简单的分类器,它是一个MSSQL表,有两列 - ID(auto_increment)和Name(nvarchar).要编辑此分类器,我创建一个包含单个gridview和两个按钮的表单 - "确定"和"取消".用户几乎可以直接在gridview中编辑表格,当他点击OK时,他所做的更改会持久保存到DB(或者如果他点击取消,则没有任何反应).
现在,我有几个关于如何组织这个的问题:
ISession应该怎样?我应该ISession为我的整个应用程序创建一个单独的; 每个表单的一个ISession(应用程序是单线程MDI); 或每个数据库操作/事务的ISession?ISession吗?也就是说,如果我ISession为每笔交易使用一个单独的,它不会打破脏跟踪吗?nhibernate ×4
c# ×3
.net ×2
asp.net-mvc ×1
hibernate ×1
lazy-loading ×1
linq ×1
mapping ×1
session ×1