我有一个列出城市的 View ,并且有一个保存每个人城市代码的表。现在,单个表上的字段可以为空,但是当我尝试执行此操作时,它会尝试插入到 View 中,并引发以下异常。
对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例或将属性的级联操作设置为使其自动保存的内容。类型:iProduct.City,实体:iProduct.City
如果我尝试将 CaseIndividualMap 上的映射设置为 .Not.Insert 或 Not.Update,那么它会忽略它并存储 null,但如果它有一个值,它也会被忽略。
任何有关如何正确映射的想法将不胜感激。
public class CityMap : ClassMap<City>
{
public CityMap() {
Table("vCities");
ReadOnly();
LazyLoad();
Id(x => x.Code).Column("Code");
Map(x => x.Description).Column("Description");
Map(x => x.StateCode).Column("StateCode");
}
}
public class CaseIndividualMap : StagingBaseMap<CaseIndividual>
{
public CaseIndividualMap()
{
Table("CaseIndividuals");
Map(x => x.CaseId);
References(x => x.City)
.Column("CityCode")
.Cascade.None()
.Nullable();
}
}
BLL
public void AddIndividual(CaseIndividual individual, AuthenticatedUser user)
{
using (var transaction = _session.BeginTransaction())
{
_session.Save(individual);
transaction.Commit();
}
}
最佳答案
抛出的异常和描述的故事不匹配。因为异常:
object references an unsaved transient instance ...
... Type: iProduct.City, Entity: iProduct.City
说:有有一个新城市实例,由CaseIndividual
引用,当
...
_session.Save(individual);
transaction.Commit();
被调用。换句话说,要获得这种类型的异常,代码必须如下所示:
var city = new City(); // or other way how to get reference (not null)
...
individual.City = city;
这是什么意思?如果我们不想分配现有的城市(已经保留,由映射的 View
返回的城市) - 代码必须如下所示:
...
individual.City = null; // here we go
_session.Save(individual);
transaction.Commit();
上面的代码片段永远不会抛出“..未保存的 transient 实例...”异常,因为没有传递给 session 。不需要 CaseIndividualMap
的特殊映射,但是...
未保存值和城市 map
实体City
的Id
映射为Code。我猜,它不是 int
类型。它将是一个string
/varchar
。
现在,如果 City
的传入实例已经持久化或者它表示"new"( transient ) 实例,NHibernate 必须立即执行。为了使其更简单、更明确,我们必须扩展 City
的“id”映射:
公共(public)城市 map () { 表(“vCities”); ... Id(x => x.代码) .Column("代码") .GenerateBy.Assigned()//NHibernate 期望 ID 由我们管理 .UnsavedValue("verydummyvalue 甚至 null")
在此处阅读有关未保存值默认值的更多信息:9.4.2. Updating detached objects
上面的技巧,assinged id 和/或 unsaved-value 正确指示 NHibernate:
When individual is coming, with assigned City.. which id (i.e.: code) differentiate from
unsaved-value
... do expect it is not transient - do not try to INSERT it
关于c# - 如何停止 nHibernate 以保存 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21565351/