相关疑难解决方法(0)

如何使用服务处理NHibernate会话生命周期?

这个问题中,我询问了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)

.net c# nhibernate session lazy-loading

7
推荐指数
1
解决办法
1204
查看次数

LINQ-NHibernate - 仅为复杂对象选择几个字段(包括Collection)

我在我的一个项目(和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)

c# linq nhibernate asp.net-mvc linq-to-nhibernate

5
推荐指数
1
解决办法
1万
查看次数

引用类时的NHibernate映射问题(延迟加载问题?)

我正在使用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)

.net c# mapping nhibernate fluent-nhibernate

4
推荐指数
1
解决办法
2718
查看次数

使用(N)Hibernate的基本模式是什么?

我正在用NHibernate创建一个简单的Windows窗体应用程序,我对我应该如何使用它感到有点困惑.引用手册:

ISession(NHibernate.ISession)

表示应用程序与持久性存储之间的对话的单线程,短期对象.包装ADO.NET连接.ITransaction的工厂.保存持久对象的强制(第一级)缓存,在导航对象图或按标识符查找对象时使用.

现在,假设我有以下情况:

我有一个简单的分类器,它是一个MSSQL表,有两列 - ID(auto_increment)和Name(nvarchar).要编辑此分类器,我创建一个包含单个gridview和两个按钮的表单 - "确定"和"取消".用户几乎可以直接在gridview中编辑表格,当他点击OK时,他所做的更改会持久保存到DB(或者如果他点击取消,则没有任何反应).

现在,我有几个关于如何组织这个的问题:

  1. 我的一生ISession应该怎样?我应该ISession为我的整个应用程序创建一个单独的; 每个表单的一个ISession(应用程序是单线程MDI); 或每个数据库操作/事务的ISession?
  2. NHibernate是否提供某种内置的脏跟踪或者我自己必须这样做?手册在这里和那里提到类似的东西,但没有详细说明.
    1. 这是怎么做到的?
    2. 是不是有巨大的开销?
    3. 它是否与NHibernate的缓存有某种联系?
    4. 这些缓存是什么?
    5. 它们不是特定的单一ISession吗?也就是说,如果我ISession为每笔交易使用一个单独的,它不会打破脏跟踪吗?
    6. 内置脏跟踪如何检测已删除的对象?

nhibernate design-patterns hibernate

0
推荐指数
1
解决办法
212
查看次数