如何使用nhibernate更新主键

时间:2011-08-29 18:21:29

标签: .net nhibernate orm fluent-nhibernate

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

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

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();
            }

1 个答案:

答案 0 :(得分:3)

尝试'已分配'id generator

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

或者

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

来自NHibernate doc

  

<强> 5.1.4.7。已分配的标识符

     

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

     

由于其固有的性质,使用此生成器的实体不可能   通过ISession的SaveOrUpdate()方法保存。相反,你必须   如果要保存对象,明确指定到NHibernate   通过调用 Save()或Update()方法更新   的ISession。