Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何停止nHibernate以保存视图?_C#_Sql_Nhibernate_Views - Fatal编程技术网

C# 如何停止nHibernate以保存视图?

C# 如何停止nHibernate以保存视图?,c#,sql,nhibernate,views,C#,Sql,Nhibernate,Views,我有一个列出城市的视图,我有一个表,可以保存每个人的城市代码。现在,单个表上的字段可以为null,但当我尝试这样做时,它会尝试插入到视图中,并引发以下异常 对象引用未保存的临时实例-在刷新之前保存临时实例,或将属性的级联操作设置为使其自动保存的内容。类型:IPProduct.City,实体:IPProduct.City 如果我尝试将CaseIndividualMap上的映射设置为.Not.Insert或Not.Update,那么它会忽略它并存储null,但如果它有一个值,它也会被忽略 任何关于如

我有一个列出城市的视图,我有一个表,可以保存每个人的城市代码。现在,单个表上的字段可以为null,但当我尝试这样做时,它会尝试插入到视图中,并引发以下异常

对象引用未保存的临时实例-在刷新之前保存临时实例,或将属性的级联操作设置为使其自动保存的内容。类型:IPProduct.City,实体:IPProduct.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();                            
    }
}

引发的异常与描述的故事不匹配。因为例外情况:

对象引用未保存的临时实例…
... 类型:IPProduct.City,实体:IPProduct.City

说明:当

...
_session.Save(individual);                
transaction.Commit();
被称为。换句话说,要获得这种类型的异常,代码必须如下所示:

var city = new City(); // or other way how to get reference (not null)
...
individual.City = city;
...
individual.City = null; // here we go
_session.Save(individual);                
transaction.Commit();
这是什么意思?如果我们不想分配现有城市(已持久化,由映射的
视图返回的城市)-代码必须如下所示:

var city = new City(); // or other way how to get reference (not null)
...
individual.City = city;
...
individual.City = null; // here we go
_session.Save(individual);                
transaction.Commit();
而上面的代码片段,将永远不会抛出“.unsaved transient instance…”异常,因为没有传递到会话。不需要对
CaseIndividualMap
进行特殊映射,但是

未保存值与城市地图 实体
City
Id
映射为代码。我想,它不是
int
类型。它将是一个
字符串
/
varchar

现在,如果
City
的传入实例已经被持久化,或者它代表的是“新”(暂时)实例,那么NHibernate现在必须。为了使其更简单和明确,我们必须扩展
城市的“id”映射:

公共城市地图() { 表(“vCities”); ... Id(x=>x.Code) .栏(“代码”) .GeneratedBy.Assigned()//NHibernate希望ID由我们管理 .UnsavedValue(“verydummyvalue或甚至null”)

请阅读此处有关未保存值的默认值的详细信息:

上述技巧,已分配的id和/或未保存的值正确指示NHibernate:

当个人来时,带有指定的城市..哪个id(即:代码)与
未保存的值相区别
…不要期望它不是暂时的-不要尝试插入它


在设置CaseIndividual属性之前,您如何加载城市?只有当当前NHibernate会话尚未意识到引用的城市时,您才会收到该错误消息。这是对我们业务层的保存响应。他们传递一个已填写对象的CaseIndividual。表单显示城市列表如果它传递一个与城市视图上的映射匹配的值,它将工作并保存个人。如果他们没有选择城市,它将传递null,这在我们的表中对于个人来说是可以的,但是它失败了,错误是“未保存的瞬态实例”您可能希望尝试在调试器中加载该代码,并确保传入CaseIndividual时,City属性实际上为null,而不是已创建的新City对象。您可以更正City对象是使用null值实例化的。我假设,由于null nHibernate将忽略e it.好的,我这样做了,它成功了。有一个城市对象,但属性为null。出于某种原因,我希望它能在这些条件下工作。感谢您的帮助和解释。很高兴看到这一点。享受NHibernate;)