【问题标题】:Skipping an new/transient NHibernate entity's ID generator strategy when an ID is already provided已提供 ID 时跳过新的/临时 NHibernate 实体的 ID 生成器策略
【发布时间】:2010-07-19 17:09:35
【问题描述】:

只是一个快速的...我的一个映射类有以下 ID 生成器策略:

<id name="UID" type="System.Guid">
    <column name ="UID" sql-type ="uniqueidentifier" />
    <generator class="guid.comb" />
</id>

有问题的实体涉及同步/合并行为,因此需要具有全局唯一标识符。

当第一次在客户端应用程序上创建实体时,它的UID 属性被分配,因此它与服务器上的等效实体的值相同。

但是,上述 ID 生成器策略会覆盖为新实体/临时实体提供的任何值。

解决方法是什么?我是否必须删除生成器策略并分配我自己的 GUID?或者生成器策略是否可配置为仅在需要时生成guid.comb?

【问题讨论】:

    标签: nhibernate null generator


    【解决方案1】:

    我认为您可以通过将 UID 设为私有字段并通过属性控制访问来实现这一点。

    public class MyClass
    {
        private Guid _uid;
    
        protected MyClass() { // parameterless ctor for NH }
    
        public MyClass(Guid uid) { _uid = uid; // assign on creation }
    
        public Guid Uid
        {
            get { return _uid; }
            private set { // do nothing or compare _uid to Guid.Empty and set }
        }
    } 
    

    【讨论】:

    • 不幸的是,NHibernate 似乎正在使用生成的 UID 更新其内部实体状态,导致以下异常: csl.Risk.Structure.RiskClass 实例的标识符从 12ae645e-c50f-4fc5- 更改b0ff-9db900bd9a4e 至 42e565c7-8dd3-416f-89a2-9db801086d93;其中第一个 guid 是生成的,第二个是分配的。无赖:(
    • 新答案:您必须删除生成器策略并分配您自己的 GUID。 :-)
    • 我正在沿着这条路走下去,NHibernate.Id.GuidCombGenerator.Generate(null, null); 确实会产生一个梳子 guid,所以我很高兴……希望它不会混淆瞬态检测行为!验证后我会给你打分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2017-02-16
    相关资源
    最近更新 更多