当已提供 ID 时,跳过新的/暂时的 NHibernate 实体的 ID 生成器策略

发布于 2024-09-10 08:30:35 字数 449 浏览 6 评论 0原文

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

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

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

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

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

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

Just a quickie ... I have the following ID generator strategy for one of my mapped classes:

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

The entity in question is involved in synchronisation / merging behaviours from which it is necessary to have a globally unique identifier.

When an entity is created on a client application for the first time, it's UID property gets assigned so that it is the same value of the equivilent entity on the server.

However the above ID generator strategy overwrites any value provided for new/transient entities.

Whats the fix? Will I have to remove the generator strategy and assign my own GUIDs? Or is the generator strategy configurable to only generate a guid.comb when required?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野侃 2024-09-17 08:30:35

我认为您可以通过将 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 }
    }
} 

I think you can accomplish this by making UID a private field and controlling access through the property.

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 }
    }
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文