Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Asp.net Mvc_Nhibernate - Fatal编程技术网

C# NHibernate仅保存对象的一部分

C# NHibernate仅保存对象的一部分,c#,asp.net-mvc,nhibernate,C#,Asp.net Mvc,Nhibernate,应用程序组件: NHibernate 3.3 氟代亚纤酸盐1.3 我现在只使用自动映射(也许这就是问题所在) 我是NHibernate的新手,所以这可能是一个简单的问题 这是基本结构(不是实际的类) 类族 { 公共虚拟Guid ID{get;set;} 公共虚拟IList成员{get;set;} } 班主任 { 公共虚拟Guid ID{get;set;} 公共虚拟族族{get;set;} 公共虚拟字符串名称{get;set;} } 我有一个个人的“编辑”视图,它将ID作为参数。然后,该操作按I

应用程序组件: NHibernate 3.3 氟代亚纤酸盐1.3 我现在只使用自动映射(也许这就是问题所在)

我是NHibernate的新手,所以这可能是一个简单的问题

这是基本结构(不是实际的类)

类族
{
公共虚拟Guid ID{get;set;}
公共虚拟IList成员{get;set;}
}
班主任
{
公共虚拟Guid ID{get;set;}
公共虚拟族族{get;set;}
公共虚拟字符串名称{get;set;}
}
我有一个个人的“编辑”视图,它将ID作为参数。然后,该操作按ID加载Person对象并渲染视图

问题是,当我随后更改某个内容并将其发回时,
个人
对象的
成员为空,因此在保存时,个人不再有族:(

我尝试添加一个“FamilyID”属性,然后将其作为视图中的一个隐藏属性,但是NHibernate持久化它时出现了一个问题(如果这是应该的工作方式,我可以发布错误)

我可以在发布回Person对象时加载它,然后复制一些信息,但这对我来说似乎是错误的

任何帮助都将不胜感激

我可以在发布回Person对象时加载它,然后进行复制 关于一些信息,但我认为这是错误的

如果视图中没有相应的族属性输入字段,则这些值将永远不会发送回控制器。因此,在更新Person对象之前,应使用FamilyID(将其与隐藏字段一起发送)从数据库中检索这些值。这是正确的流程


更新:


据说处理这种情况的最佳方法是使用视图模型(DUH)。因此,您将设计一个视图模型,该模型将仅包含用户在视图中应该编辑的属性。然后,您将视图强类型化为视图模型,并且您的HttpPost控制器操作将以视图模型为参数。在此操作中,您将加载需要更新的整个Person域从数据库中,设置从视图模型修改的属性(使用诸如之类的工具非常容易),然后将域模型保留到数据库中。只有属于视图一部分的属性才会从此人域模型中修改。

因此,如果我有10-15个对不同对象的引用(“最佳朋友”)可能是
public virtual Person BestFriend
等),我需要加载它们中的每一个,只是为了将一个对象持久化?这似乎有些过分。另一个问题是,NHibernate(或我正在使用的FluentNHibernate)似乎不允许我同时拥有“Family”对象和“FamilyID”对象。是的,您需要加载所有引用。您可以通过内部联接在单个SQL查询中实现这一点以优化性能。但显然,实现这一点的最佳方法是使用一个视图模型,该模型将仅包含应该在视图中编辑的属性。然后在控制器操作中加载在一次查询中,使用诸如AutoMapper之类的工具从视图模型更新域模型的属性,并使用NHibernate持久化域模型。AutoMapper使此场景变得非常简单。我将看一看AutoMapper,它确实意味着从DB、b获取对象需要进行一次额外的查询但我想这也没那么糟糕。什么SQL???我以为你在使用NHibernate。你根本不需要编写任何SQL。这就是NHibernate的全部目的。它是一个ORM。很抱歉没有读到你的全文,经过编辑,我以为“带内部连接的SQL查询”指的是编写SQL。。
class Family
{
   public virtual Guid ID { get; set; }
   public virtual IList<Person> Members { get; set; }
}
class Person
{
   public virtual Guid ID { get; set; }
   public virtual Family Family { get; set; }
   public virtual string Name { get; set; }
}