gpt4 book ai didi

c# - 在将实体保存到数据库之前,如何在 NHibernate 监听器中获取实体的 ID?

转载 作者:行者123 更新时间:2023-11-30 12:17:12 25 4
gpt4 key购买 nike

我们有一个新要求,即每个实体都必须有一个用户可分配的 ID:

public class Entity
{
public int ServerId { get; set; }
public int UserId { get; set; }
}

ServerId 是使用 HiLo 自动生成的 ID,UserId 是用户指定的 ID。但是,如果用户没有设置 UserId,它应该默认为任何 ServerId。所以我创建了一个这样的监听器:

public class CustomEventListener : IPreInsertEventListener
{
public bool OnPreInsert(PreInsertEvent @event)
{
var entity = @event.Entity as Entity;

if (entity.UserId == 0)
{
entity.UserId = entity.ServerId;
}

return false;
}
}

不幸的是,在此预插入阶段,ServerId 始终为 0,因此 UserId 始终为 0。有谁知道如何获取生成的 ServerId 它被保存到数据库但是之后 ServerId 被 NHibernate 填充?

附言我还假设这对于 Identity 生成器是不可能的,因为它保存到数据库,然后获取数据库使用的 ID。有人可以证实这一点吗?

最佳答案

感谢 Ayende 在这里的博文,找到了解决方案:

http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

原来你不仅要在实体中改变它,还要改变实体状态:

public class CustomEventListener : IPreInsertEventListener
{
public bool OnPreInsert(PreInsertEvent @event)
{
var entity = @event.Entity as Entity;

if (entity.UserId == 0)
{
entity.UserId = entity.ServerId;
Set(@event.Persister, @event.State, "UserId", entity.UserId);
}

return false;
}

private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
{
var index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1)
return;
state[index] = value;
}
}

关于c# - 在将实体保存到数据库之前,如何在 NHibernate 监听器中获取实体的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110395/

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