我的一个表的主键是一个字符串。字符串是我想在某个时间点更新的代码。我怎么能在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();
}
答案 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。