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

标签 c# sql nhibernate view

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

实体CityId映射为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/

相关文章:

c# - 如何让你的 if 更短?

c# - 当我在多个集线器中使用共享连接时,OnConnected 方法未调用 SignalR

MySQL删除不同的无序元组

mysql - 左外连接问题

c# - 全网数据同步

nhibernate - 是否可以从 NHibernate IStatelessSession 或 ISession 获取所有映射实体的列表?

c# - 在 web.config 中指定相对文件位置以供标准 C# 类库使用

c# - 使用 Silverlight 4 的客户端 Excel 互操作

mysql - MYSQL中以列为行的表获取数据

c# - NHibernate 和 Firebird 的性能问题