从与NHibernate的hasMany关系阅读uncomitted数据(Read uncomitt

2019-10-29 05:22发布

我有一个NHibernate的地图,其限定的类型一的hasMany关系,即一类具有另一个类的列表。

我想NHibernate的是能够读取未提交的数据包括来自的hasMany关系造成的列表。

我的IsolationLevel ReadUncomitted,我能写数据,并且在提交之前读取它。

但是,列表总是空的,除非我犯第一。

有没有一种方法,使NHibernate的填充来自的hasMany-关系的数据对象?

编辑

事实证明,在一个类中的任何非原始类型被未提交的读取填充,除非他们实际上是添加到类。

例如,类Foo下面有一个列表Member这-数据库-由连接Id 。 如果我坚持的一个实例Foo和实例Member使用NHibernate的数据库,这两个其实都是由价值相关的Id ,那么Foo 不会有预期的情况下Member ,如果我在完成之前读回未提交的(即交易)。

public class Member
{
     Guid Id{ get; set; }
}

public class Foo
{
    List<Member> MemberList{ get; set; }
}

// the mapping
public class FooMap
{
    HasMany(x => x.MemberList).KeyColumn("Id").PropertyRef("Id");
}

但是,如果我创建的实例Foo和实例Member ,并设置后者为前者的参考,并坚持既使用NHibermate数据库,然后Foo 有预期的实例Member ,当我完成之前读回交易。

如果我完成交易,然后Foo将有预期的情况下Member在后续读取; 只要在交易完成后是无关紧要是否Member只存在与正确的FK一个数据库记录Foo或它是一个参考Foo

经修订的课题:这是有可能的NHibernate的填充基于FK-关系复杂的成员在未提交读?

Answer 1:

似乎这里是一些一般的混乱,所以要澄清几件事情:

  • 事务隔离级别仅影响变更其他事务是可见的。 事务总是可以回读它已修改自身的数据。

  • 如果遵循的调用commit()的交易有没有对是否拥有该事务可以读取这些改变或不NHibernate会话。 它总是可以的。

  • 当然,NHibernate不会修改已加载的实例。 你,作为模型的开发,是负责制定在加载实体的变化,确保模型仍然是有效的,并与您的业务规则保持一致,然后NHibernate的将存储在数据库中的变化。 这不是 NHibernate的工作,使你的一部分,模型,你在另一个部分的修改相一致。

  • 之前或之后调用commit()回读不要紧,因为NHibernate的保证会话将只包含在每个实体的最多一个副本。 所以,当你查询你刚刚保存的对象,你只会得到相同的,已经加载,未修改的实例。

  • 如果关闭会话,并打开一个新的会话为您查询重要的是。 然后,NHibernate的会再次实例化对象,它会反映数据库的当前状态。 同样的效果可以在原来的会话,如果你在会话中使用清除()或逐出()来了(在已被称为冲洗()或提交())。 这些方法从会话中删除已经加载的情况下,这样下次你查询它的时候,会话将创建一个新的实例,那么它当然会反映数据库的当前状态,从当前的交易可见。



Answer 2:

当你实例化一个新的对象就自然包含了所有默认值是无论是通过构造函数设置属性+。

这意味着你必须要想在它得到任何持久性数据查询您的实体对象。

因此,例如,如果我们有这两个类

public class Customer
{
    public virtual Guid Id { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

public class Order
{
    public virtual Guid Id { get; set; }

    public virtual string Description { get; set; }
    //todo add items
}

然后,我们就需要这样的方法:

public Customer GetCustomerWithUncommitedOrders(Guid customerId)
{
    ITransaction t = null;
    Customer customer = null;

    try
    {
        t = session.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);


        customer = session.QueryOver<Customer>().Where(x => x.Id == customerId).Fetch(x => x.Orders).Eager.List();


        t.Commit();
    }
    catch (Exception ex)
    {
        //todo log

        if (t != null)
            t.Rollback();
    }
    finally
    {
        if (t != null)
            t.Dispose();
    }

    return customer;
}

然后,我们可以编辑的客户,并将其保存在另一个(或相同,这取决于“编辑”持续时间)的交易。 然而,这可能带来了并发性的担忧。



文章来源: Read uncomitted data from HasMany-relationship with NHibernate