如何使用 nhibernate 更新主键

发布于 2024-12-02 03:09:54 字数 1546 浏览 3 评论 0原文

我的一个表的主键是一个字符串。该字符串是我想在某个时间点更新的代码。我怎样才能在休眠中做到这一点。 请注意,有一个外键连接到该列,我需要将更新级联到该列。

为了便于讨论,我们假设我的映射如下

public class Code
{
    public virtual string Id { get; set; }
    public virtual string Name { get; set; }

    public class CodeMap : ClassMap<Code>
    {
        public CodeMap()
        {
            Table("BusinessCode");
            Id(x => x.Id, "Id");
            Map(x => x.Name, "Name").Nullable();
        }

    }
}    

public class Data
{
    public virtual int Key { get; set; }
    public virtual Code DataCode{ get; set; }
    public virtual string Desc { get; set; }
    public class DataMap : ClassMap<Data>
    {
        public DataMap()
        {
            Table("Data");
            Id(x=>x.Key,"Key");
            Map(x => x.Desc).Column("desc");
            References(x => x.Code, "BusinessCode").Nullable().Cascade.SaveUpdate();
        }
    }
}

表结构

BusinessCode Table
Id(nvarchar(100)) -primarykey
Name(nvarchar(1024))



Data Table
id(int) - auto generated primary key
businesscode(nvarchar(100)) - foreign key to BusinessCode Id
desc(nvarchar(1024))

这是我用来更新我的对象的代码

using (var trans = Session.BeginTransaction())
            {
                var modifiedSource = Session.Load<Code>(id);
                modifiedSource.Id = "newId";
                modifiedSource.Name = "new name";
                Session.Update(modifiedSource);
                trans.Commit();
            }

The primary key for one of my tables is a string. THe string is a code which i would like to update at some point of time. How can I do this in nhibernate.
Please note there is a foreign key connected to this column which I need to cascade updates to.

For the sake of discussion let us assume my mapping is as below

public class Code
{
    public virtual string Id { get; set; }
    public virtual string Name { get; set; }

    public class CodeMap : ClassMap<Code>
    {
        public CodeMap()
        {
            Table("BusinessCode");
            Id(x => x.Id, "Id");
            Map(x => x.Name, "Name").Nullable();
        }

    }
}    

public class Data
{
    public virtual int Key { get; set; }
    public virtual Code DataCode{ get; set; }
    public virtual string Desc { get; set; }
    public class DataMap : ClassMap<Data>
    {
        public DataMap()
        {
            Table("Data");
            Id(x=>x.Key,"Key");
            Map(x => x.Desc).Column("desc");
            References(x => x.Code, "BusinessCode").Nullable().Cascade.SaveUpdate();
        }
    }
}

Table structure

BusinessCode Table
Id(nvarchar(100)) -primarykey
Name(nvarchar(1024))



Data Table
id(int) - auto generated primary key
businesscode(nvarchar(100)) - foreign key to BusinessCode Id
desc(nvarchar(1024))

here's the code which i use to update my object

using (var trans = Session.BeginTransaction())
            {
                var modifiedSource = Session.Load<Code>(id);
                modifiedSource.Id = "newId";
                modifiedSource.Name = "new name";
                Session.Update(modifiedSource);
                trans.Commit();
            }

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

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

发布评论

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

评论(1

羅雙樹 2024-12-09 03:09:54

尝试“分配”id 生成器< /a>:

<class name="Dataset" table="Dataset" >
    <id name="id" column="id" type="String">
        <generator class="assigned" />
    </id>
    ...
</class>

Id(x => x.Id).GeneratedBy.Assigned();

来自 NHibernate 文档

5.1.4.7。分配的标识符

如果您希望应用程序分配标识符(而不是
让 NHibernate 生成它们),您可以使用指定的生成器。
这个特殊的生成器将使用已经分配的标识符值
到对象的标识符属性。使用此功能时要非常小心
分配具有业务意义的键的功能(几乎总是一个糟糕的
设计决策)。

由于其固有的性质,使用该生成器的实体不能
通过 ISession 的 SaveOrUpdate() 方法保存。相反,你必须
显式指定 NHibernate 是否应保存对象或
通过调用 Save() 或 Update() 方法进行更新
ISession。

Try 'assigned' id generator:

<class name="Dataset" table="Dataset" >
    <id name="id" column="id" type="String">
        <generator class="assigned" />
    </id>
    ...
</class>

Or

Id(x => x.Id).GeneratedBy.Assigned();

From NHibernate doc

5.1.4.7. Assigned Identifiers

If you want the application to assign identifiers (as opposed to
having NHibernate generate them), you may use the assigned generator.
This special generator will use the identifier value already assigned
to the object's identifier property. Be very careful when using this
feature to assign keys with business meaning (almost always a terrible
design decision).

Due to its inherent nature, entities that use this generator cannot be
saved via the ISession's SaveOrUpdate() method. Instead you have to
explicitly specify to NHibernate if the object should be saved or
updated by calling either the Save() or Update() method of the
ISession.

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