2011-08-29 49 views
2

我的一个表的主键是一个字符串。字符串是我想在某个时间点更新的代码。我如何在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

我只是创建一个新的对象,如果我是你。 – UpTheCreek

+0

我没有让你? – Mulki

+3

可能是一个糟糕的主意,要随时更改主键值。这是我书中更多的一次性手写脚本更新。 – dotjoe

回答

2

尝试'分配'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的,如果对象应通过调用该保存()或update()的 的Isession的方法保存或 更新。

+0

尝试它(我从DB..update这两个字段加载对象,并使用更新)..抛出错误说... 的实例的标识符已从x更改为y – Mulki

+0

@Mulki:您必须更具体,在哪里抛出从,堆栈跟踪等。看看这个:http://stackoverflow.com/questions/2624109/identifier-of-an-instance-of-xxx-was-altered-from-y-to-z/2624350#2624350 – Dmitry

+0

添加了一些代码,以提供更多详细信息,了解它如何更新.. iv已经看到了这个问题..即时通讯直接更新对象...不通过另一个对象更新它 – Mulki