c# - NHibernate EventListeners - 获取正在保存的实体的属性值

标签 c# nhibernate castle-activerecord event-listener

我正在实现自定义 EventListener 以在 NHibernate 中保存审核信息。

我目前正在扩展 DefaultSaveOrUpdateEventListener,覆盖 PerformSaveOrUpdate,遍历每个实体的属性并将它们保存在别处。

这适用于简单的属性,但在级联保存一对多关系时失败。

如果我采用以下实体:

[ActiveRecord]
public class Child
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [BelongsTo]
    public Parent Parent { get; set; }
}

[ActiveRecord]
public class Parent
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [HasMany(Cascade = ManyRelationCascadeEnum.SaveUpdate)]
    public IList<Child> Children { get; set; }
}

然后保存一个有 child 的 parent :

ActiveRecordMediator<Parent>.Save(new Parent
{
    Children = new List<Child>
    {
        new Child()
    }
});

当我的 EventListener 被保存到数据库时,子项将获得分配给它的正确父项,但是当我的 EventListener 被调用时,子项的“Parent”属性为 null。

在这种情况下,我如何才能获得实际持久保存到数据库中的值?

[编辑] 我最近一直在考虑通过连接级联并查看当时保存的其他内容来使其工作,但这似乎非常不可靠,我更愿意从 NHibernate 中获取数据所以我知道它与数据库一致。

最佳答案

我不确定如何使用 ActiveRecord 完成此操作,但它与 NHibernate 保持父/子关系的机制有关。

在 NHibernate 中保存父级之前保存子级联是设计使然,这取决于关系的哪一端被标记为“inverse=true”,并且子级需要在元素上具有“not-null=true”属性(决定哪一端拥有关系)。这将使 child 能够管理关系的状态。

然后您可以简单地保存 child , parent 将更新适当的信息。这将生成一个 INSERT 语句,而不是您现在可能看到的 INSERT AND UPDATE。不确定这是否能解决您的问题,但我相信您遇到的问题与此行为有关。您可以通过此链接阅读更多信息:

https://www.hibernate.org/hib_docs/nhibernate/html/example-parentchild.html

关于c# - NHibernate EventListeners - 获取正在保存的实体的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750010/

相关文章:

c# - 哪些自动代码生成工具可用于 CaSTLe ActiveRecord 类?

c# - JQuery - 用 <li> 替换 html 按钮,同时保持值不变

c# - GUID 在 C++ 中的使用 :

c# 从数组中删除字符串

c# - IIS 7 上的 nHibernate,SQLClientPermissionException

nhibernate - 使用 NHibernate 和 Codesmith 生成 ORM

具有类自动生成 : Subsonic, CaSTLe AR 的 .NET ORM 解决方案,...?

c# - 为什么这个 LINQ Select 表达式不起作用

c# - NHibernate 平等 : How do I ensure only one row is persisted from many "equal" . NET 对象?

c# - 城堡 ActiveRecord : Map to IUserType wihtin Class in C#