gpt4 book ai didi

c# - hibernate 。在同一 session 中创建后包为空

转载 作者:太空宇宙 更新时间:2023-11-03 22:08:16 24 4
gpt4 key购买 nike

我有对象,其中包含对象列表。

public class Product: IProduct
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }

public virtual IList<IFunction> Functions { get; set; }
}

public class Function : IFunction
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }

public virtual IProduct Product { get; set; }
}

对象的映射列表( IList < IFunction > ):

<bag name="Functions" cascade="all" table="T_WEBFUNCTIONS" lazy="false">
<key column="PRODUCT_ID" />
<one-to-many class="Function" />
</bag>

代码:

我尝试创建一个新的 Product 对象

    public IProduct SetProduct(string productName)
{
// Product repository, which have nhibernate opened session ( ISession )
IDBRepository<IProduct> rep = Repository.Get<IProduct>();

// Create new object of product
rep.Create(new Product() { Name = productName });

// get created object by name
prod = rep.Query().Where(x => x.Name == productName).SingleOrDefault();

// I HAVE ISSUE HERE
// prod.Functions == NULL. It must be a new List<Function>()
// Nhibernate don't create empty list for me and this property always null

return prod;
}

但是。当 nhibernate session 关闭并再次打开时,将创建列表并包含 0 个项目。

如果我在同一 session 中创建一个对象(Product)并在创建后获取它,bag 将为空。

数据存储库的作用

public class DBRepository<T> : IDBRepository<T>
{
protected ISession CurrentSession;

public DBRepository(ISession session)
{
CurrentSession = session;
}

public void Create(T obj)
{
var tmp = CurrentSession.BeginTransaction();
CurrentSession.Save(obj);
tmp.Commit();
}
}

最佳答案

当您调用 new Product() 时,您的代码正在实例化一个对象,并且 List<> 属性开始时为 null。 NHibernate 在这方面帮不了你——这是你决定要做的(通过不覆盖默认的 c'tor)。

NHibernate 的一级缓存(简短说明 here)在您提交事务时保存您的对象,因此当您在同一个打开的 session 中通过其 ID 请求对象时,NHibernate 会跳过从数据库中获取实体并为您提供服务相同的实例化对象。您可以使用 Object.ReferenceEquals(prodYouCreated, prodRetrievedFromRepository) 进行测试。

当您关闭 session 时,一级缓存将被清除,下次您查询时,NHibernate 会获取数据并自行构建对象 - 它会选择返回一个零长度列表而不是 null。这是默认行为。

希望对您有所帮助,
琼诺

关于c# - hibernate 。在同一 session 中创建后包为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com