gpt4 book ai didi

c# - 如何停止 nHibernate 以保存 View ?

转载 作者:行者123 更新时间:2023-11-30 22:09:28 25 4
gpt4 key购买 nike

我有一个列出城市的 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

说:当

...
_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();

而上面的代码片段,永远不会抛出“..unsaved transient instance...”异常,因为没有传递给 session 。不需要 CaseIndividualMap 的特殊映射,但是...

未保存值和城市映射

实体 CityId 被映射为 Code。我猜,它不是 int 类型。它将是一个 string/varchar

现在,如果 City 的传入实例已经持久化,或者如果它表示"new"( transient ) 实例,NHibernate 现在必须。为了使其更简单和明确,我们必须扩展 City 的“id”映射:

公共(public)城市 map () { 表(“虚拟城市”); ... Id(x => x.Code) .Column("代码") .GeneratedBy.Assigned()//NHibernate 期望 ID 由我们管理 .UnsavedValue("verydummyvalue or even 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com