Nhibernate字典<Entity,?> Entity.ID哈希码问题

罗伊·明德尔(Royi Mindel)

我有以下实体:

public class Entity1 
{
    public Guid ID { get; set; }

    public override int GetHashCode()
    {
        return ID.GetHashCode();
    }
}

public class Entity2
{
    public Dictionary<Entity1,int> Dict { get; set; }
}

我重写Entity1的GetHashCode以反映它的ID,因为它是它具有的最不可变的属性,而不是通过引用保留它,因为我正在运行多个会话,并且字典必须是“会话”安全的。

在本次讨论中,我在字典中有一个int值,该值并不真正相关。

使用NHibernate可以正确映射两个实体。

可以说我有以下代码:

using (var session = GetSession())
{
    var entity1 = new Entity1();
    var entity2 = new Entity2();
    entity2.Dict[entity1] = 1;
    session.SaveOrUpdate(entity1);
    session.SaveOrUpdate(entity2);
} 

在此代码中,Dict不会保存任何键值-因为在保存之前将Entity1添加到Dict中时,它将为它提供一个空ID的哈希码,该哈希码紧随其后将以实际ID保存,从而破坏了字典。

我正在寻找最佳实践/最佳解决方案。

我目前的选择:

  • 请记住,在将Entity1添加到任何词典(我有一堆)之前,请务必保存它。我不喜欢这个选项,因为它确实不是傻瓜式的,而且我相信以后其他人也不会注意这一点,并且会造成可怕的错误。

  • 在保存之前-总是反复检查键,值集合,保存键并将它们重新分配到字典中,此解决方案似乎确实缺乏性能,并且会引起各种不同的问题。但最重要的是-听起来应该有一个更好的解决方案。

处理这种情况的最佳方法是什么?

多安·范团

在我的项目中,我们自己进行ID生成:

private int _id = -1;
public virtual Id
{
    get {return _id == -1? (_id = IdGenerator.GenerateNextId()): _id;}
    protected set {_id = value;}
}

IdGenerator是HiLo(TableHiLo或SequenceHiLo)的实现。然后使用assignedID生成策略映射所有实体

<id name="Id" column="ID">
  <generator class="assigned" />
</id>

按照这种安排,当访问Id属性时,所有对象都将具有唯一的ID,并且该ID永远不会更改。该解决方案已经为我服务了三年,而且没有任何复杂性。但是,转换现有系统可能很复杂。

阅读本文后,我想到了这一点:不要让休眠模式窃取您的身份

编辑:

有两个选项可以检测未保存的对象。一种是使用版本属性。但是,并非所有实体都需要这样的属性,因此我使用了一个拦截器来跟踪实体的瞬时状态:

public interface ITransienceAware
{
    bool IsTransient {get; set;}
}

所有实体的基类都显式实现此接口(从视图中隐藏IsTransient属性,避免愚蠢的错误,因为需要将对象强制转换为ITransienceAware来更改值):

public abstract class MappedEntity: ITransienceAware // and some more unrelated interface
{
    //...................unrelated code
    bool ITransienceAware.IsTransient { get; set; }
    //...................unrelated code
}

拦截器OnLoad和OnSave方法将IsTransient更改为true。

另一个重要的实现细节是IdGenerator:它是用于SQL Server的TableHiLo和用于Oracle的SequenceHiLo的实现,并且它必须在单独的事务中访问数据库以防止跨请求锁定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

字典<Entity,int>的流利NHibernate映射

来自分类Dev

从Entity Framework查询到NHibernate的转换困难

来自分类Dev

NHibernate vs Entity Framework 6针对大量用户的性能

来自分类Dev

NHibernate尝试在保存时将Entity强制转换为IDictionary

来自分类Dev

使用NHibernate将本地SQL映射到Entity

来自分类Dev

NHibernate vs Entity Framework 6针对大量用户的性能

来自分类Dev

nhibernate中的Update(Object obj,Object id)和Update(string Entity,Object obj)有什么区别

来自分类Dev

nhibernate中的Update(Object obj,Object id)和Update(string Entity,Object obj)有什么区别

来自分类Dev

Entity Framework Adding and Deleting an Entity?

来自分类Dev

EntityCommandExecutionException:无效的列名'Entity_Id'

来自分类常见问题

从ID列表更新Entity Framework中的多行

来自分类Dev

NHibernate Envers,例如带有Entity Framework 6+的审核日志

来自分类Dev

如何用JPA注释Map <Entity,Entity>?

来自分类Dev

LINQ / Entity框架:无参数构造函数问题

来自分类Dev

Xrm.Page.data.entity.save(“ saveandclose”)出现问题

来自分类Dev

使用Entity Framework代码优先的数据库问题

来自分类Dev

从Windows通过Entity Framework连接到Informix的问题

来自分类Dev

在Entity Framework Core中获取当前用户ID的正确方法

来自分类Dev

Hibernate JPA persist saved child entity with null parent id

来自分类Dev

使用ID设置Symfony2 Entity表单字段

来自分类Dev

Comapare Ienumerable <int>和List <Entity>并获取匹配的ID

来自分类Dev

在Entity Framework / Linq中基于相同名称连接ID

来自分类Dev

插入后在Entity Framework 5中获取记录ID

来自分类Dev

在Entity Framework Core中获取当前用户ID的正确方法

来自分类Dev

仅将Entity的List <id,Name>放入Viewbag。“ EntityName”

来自分类Dev

Entity Core FluentAPI - 作为主键和外键的 ID

来自分类Dev

repository.InsertAsync 总是返回 entity.Id 0

来自分类Dev

如何从 Webhook 使用 entity_id 获取付款

来自分类Dev

使@Entity自身持久

Related 相关文章

  1. 1

    字典<Entity,int>的流利NHibernate映射

  2. 2

    从Entity Framework查询到NHibernate的转换困难

  3. 3

    NHibernate vs Entity Framework 6针对大量用户的性能

  4. 4

    NHibernate尝试在保存时将Entity强制转换为IDictionary

  5. 5

    使用NHibernate将本地SQL映射到Entity

  6. 6

    NHibernate vs Entity Framework 6针对大量用户的性能

  7. 7

    nhibernate中的Update(Object obj,Object id)和Update(string Entity,Object obj)有什么区别

  8. 8

    nhibernate中的Update(Object obj,Object id)和Update(string Entity,Object obj)有什么区别

  9. 9

    Entity Framework Adding and Deleting an Entity?

  10. 10

    EntityCommandExecutionException:无效的列名'Entity_Id'

  11. 11

    从ID列表更新Entity Framework中的多行

  12. 12

    NHibernate Envers,例如带有Entity Framework 6+的审核日志

  13. 13

    如何用JPA注释Map <Entity,Entity>?

  14. 14

    LINQ / Entity框架:无参数构造函数问题

  15. 15

    Xrm.Page.data.entity.save(“ saveandclose”)出现问题

  16. 16

    使用Entity Framework代码优先的数据库问题

  17. 17

    从Windows通过Entity Framework连接到Informix的问题

  18. 18

    在Entity Framework Core中获取当前用户ID的正确方法

  19. 19

    Hibernate JPA persist saved child entity with null parent id

  20. 20

    使用ID设置Symfony2 Entity表单字段

  21. 21

    Comapare Ienumerable <int>和List <Entity>并获取匹配的ID

  22. 22

    在Entity Framework / Linq中基于相同名称连接ID

  23. 23

    插入后在Entity Framework 5中获取记录ID

  24. 24

    在Entity Framework Core中获取当前用户ID的正确方法

  25. 25

    仅将Entity的List <id,Name>放入Viewbag。“ EntityName”

  26. 26

    Entity Core FluentAPI - 作为主键和外键的 ID

  27. 27

    repository.InsertAsync 总是返回 entity.Id 0

  28. 28

    如何从 Webhook 使用 entity_id 获取付款

  29. 29

    使@Entity自身持久

热门标签

归档