Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从asp.net POST操作方法更新nhibernate实体的正确方法是什么?

从asp.net POST操作方法更新nhibernate实体的正确方法是什么?
EN

Stack Overflow用户
提问于 2009-04-27 08:40:21
回答 2查看 3.5K关注 0票数 8

我刚开始接触nHibernate,并试图找到正确的方法来更新web应用程序表单帖子中分离的对象。(我们使用的是ASP.NET MVC)

我试图更新的对象包含(除其他外)子对象的IList,映射如下所示:

代码语言:javascript
运行
AI代码解释
复制
<bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
      <key column="JobNumber" />
      <one-to-many class="SliceClass" />
</bag>

我们已经安排了MVC编辑视图表单,以便当它回发时,我们的操作方法被传递给am对象(包括子项的List<> )。我们通过表单正确地进行了所有实体ID的往返。

我们对post操作方法的天真尝试使用了一个session.SaveOrUpdate( parentObject ),它使用默认的模型绑定器从视图表单中刮过的parentObject。

对于下列任何一种场景,这似乎都很好:

创建一个新父object

  • Modifying父properties

  • Adding新子objects

  • Modifying现有子对象(查看nHibernate日志,可以正确地确定对象是新的还是现有的,并发出适当的更新或插入)

失败的情况是:-删除子对象-也就是说,如果它们不在IList中,则不会从数据库中删除它们。没有例外或任何事,他们只是没有被删除。

我的理解是,这是因为nHibernate创建一个需要删除的子列表的魔力并不适用于分离的实例。

我还没有找到一个简单的示例,说明这种操作方法在nHibernate中应该是什么样子(即使用模型绑定对象作为独立的nHibernate实例)--基于MS (例如http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx)的示例似乎使用'ApplyPropertyChanges‘方法将更改的属性从模型绑定对象复制到重新加载的实体实例。

因此,毕竟,问题很简单--如果我有模型绑定器给我一个包含子对象集合的新对象,我应该如何通过nHibernate更新它(其中“更新”可能包括删除子对象)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-27 11:50:07

这是一个我认为你想做的事情的例子。如果我误解了你想做的事,请告诉我。

给定以下“域”类:

代码语言:javascript
运行
AI代码解释
复制
public class Person
{
    private IList<Pet> pets;

    protected Person()
    { }

    public Person(string name)
    {
        Name = name;
        pets = new List<Pet>();
    }

    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IEnumerable<Pet> Pets
    {
        get { return pets; }
    }

    public virtual void AddPet(Pet pet)
    {
        pets.Add(pet);
    }

    public virtual void RemovePet(Pet pet)
    {
        pets.Remove(pet);
    }
}

public class Pet
{
    protected Pet()
    { }

    public Pet(string name)
    {
        Name = name;
    }

    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}

通过以下映射:

代码语言:javascript
运行
AI代码解释
复制
   public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {
            LazyLoad();
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
            HasMany(x => x.Pets)
                   .Cascade.AllDeleteOrphan()
                   .Access.AsLowerCaseField()
                   .SetAttribute("lazy", "false");
        }
    }

    public class PetMap : ClassMap<Pet>
    {
        public PetMap()
        {
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
        }
    }

这个测试:

代码语言:javascript
运行
AI代码解释
复制
    [Test]
    public void CanDeleteChildren()
    {
        Person person = new Person("joe");

        Pet dog = new Pet("dog");
        Pet cat = new Pet("cat");

        person.AddPet(dog);
        person.AddPet(cat);

        Repository.Save(person);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        Person retrievedPerson = Repository.Get<Person>(person.Id);
        Repository.Evict(retrievedPerson);

        retrievedPerson.Name = "Evicted";

        Assert.AreEqual(2, retrievedPerson.Pets.Count());
        retrievedPerson.RemovePet(retrievedPerson.Pets.First());

        Assert.AreEqual(1, retrievedPerson.Pets.Count());

        Repository.Save(retrievedPerson);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        retrievedPerson = Repository.Get<Person>(person.Id);
        Assert.AreEqual(1, retrievedPerson.Pets.Count());
    }

运行并生成以下sql:

DeletingChildrenOfEvictedObject.CanDeleteChildren :传递NHibernate:插入Person值( @p0,@p1);@p0= 'joe',@p1 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

NHibernate:插入Pet值( @p0,@p1);@p0=“Pet”,@p1 = '464e59c7-74d0-4317-9c22-9bf801013abb‘

NHibernate:插入Pet值( @p0,@p1);@p0= 'cat',@p1 =‘010c2fd9-59c4-94fb-9bf801013abb’

NHibernate:更新Pet Person_id = @p0,其中Id = @p1;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2',@p1 = '464e59c7-74d0-4317-9c22-9bf801013abb‘

NHibernate:更新Pet Person_id = @p0,其中Id = @p1;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2',@p1 =‘01010c2fd9-59c4-59c4-94fb-9bff801013abb’

NHibernate:选择person0_.Id作为Id5__,从Person person0_中选择person0_.Name作为person0_.Id=@p0;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

NHibernate:选择pets0_.Person_id作为Person3_1_,pets0_.Id作为Id1_,pets0_.Id作为Id6__,pets0_.Name作为Name6__从宠物pets0_ pets0_.Person_id=@p0;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

NHibernate:更新个人设置名称= @p0,其中Id = @p1;@p0 =“逐出”,@p1 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

NHibernate:更新宠物集名称= @p0,其中Id = @p1;@p0 =‘d1’,@p1 = '464e59c7-74d0-4317-9c22-9bf801013abb‘NHibernate: Person_id = null,其中Person_id = @p0,Id = @p1;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2',@p1 = '010c2fd9-59c4-4e66-94fb-9bf801013abb’

NHibernate:从宠物中删除Id = @p0;@p0 = '010c2fd9-59c4-4e66-94fb-9bf801013abb‘

NHibernate:选择person0_.Id作为Id5__,从Person person0_中选择person0_.Name作为person0_.Id=@p0;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

NHibernate:选择pets0_.Person_id作为Person3_1_,pets0_.Id作为Id1_,pets0_.Id作为Id6__,pets0_.Name作为Name6__从宠物pets0_ pets0_.Person_id=@p0;@p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2‘

注意从宠物中删除..。

因此,您需要做的是将修改过的集合传递给一个Person对象(在本例中),它应该能够决定要删除什么。确保设置了Cascade.AllDeleteOrphan()属性。

票数 4
EN

Stack Overflow用户

发布于 2009-04-27 12:44:47

Rob的回答说服我更仔细地研究‘将现有项加载到新会话中,然后合并’的方法,当然还有ISession.Merge,它似乎完全符合我的要求,即获取一个新的对象,并将其与刚刚重新加载到第二次会话的前一个对象合并。

因此,我认为我试图问的问题的答案是“重新加载现有实体,然后用新实体调用'ISession.Merge‘。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/794314

复制
相关文章
Nginx正确记录post日志的方法
事实上可以很简单,这取决于把 access_log 放在哪个 location 里面。
星哥玩云
2022/06/28
3.6K0
ASP.NET的session操作方法总结
该文章介绍了.NET中的HttpSessionStateBase类,它提供了存储会话状态的方法,并提供了从会话状态中检索数据的公共方法。此外,该类还提供了同步访问会话状态的方法,以确保线程安全。
彭泽0902
2018/01/04
2.7K0
光纤测试仪的正确操作方法
光纤测试仪常见的有光功率计、光源和光时域反射计(OTDR)。测试的时候都要求使用跳线,以延长仪器测试端口的精度寿命;如果被测光纤中的光功率太强,则必须使用光衰减器先降低光功率,才能安全地进行测试;如果是OTDR,则被测光纤中不能有光功率射出,否则,OTDR内的检测器件容易损毁。
朗坤君
2021/05/14
4.7K0
NHibernate 代码映射实体类
NHibernate 3.2 自带了代码映射机制, 作为 xml 映射之外的一种映射方式, 由于推出的时间比较晚, 所以资料相对比较少, 而且与社区版的 Fluent Mapping 和 Attribute Mapping 不同, 有其独特的设计风格。
beginor
2020/08/10
9590
NHibernate 代码映射实体类
ASP.Net Core的Code Fist代码先行操作方法
Asp.Net  core的Code Fist(代码先行)主要有以下几步: 1.创建实体类 2.创建数据库上下文 3.填加连接字符串 4.依赖注入 5.添加基架工具并执行初始迁移 6搭建模型的基本架构(更具模型生成网页Page) 首先需要在创建出实体类,此处以微软官方文档中的Movice实体类为例。 右键单击“Models”文件夹。 选择“添加” > “类”。 将类命名为“Movie”,并添加以下属性: using System; namespace RazorPagesMovie.Models {
码农阿宇
2018/04/18
8970
ASP.Net Core的Code Fist代码先行操作方法
【数据可视化】数据可视化的正确操作方法
数据可视化,是一种用来将复杂信息数据清晰表述出来的强大有力的工具。通过可视化信息,我们的大脑可以更有效地合成和保留信息内容,增强对信息的理解。但是如果不正确数据可视化,它可能弊大于利。错误的图表可以减少数据的信息,或者更糟的是,完全背道而驰!这就是完美的数据可视化极其依赖设计的原因。 这里有10个数据可视化的案例,包括你可能犯的错误和快速修复补救的方法。 错误1.混乱的饼图分割 饼图,是最简单的图表之一。不过偏偏有人喜欢把它搞得很复杂。 饼图的设计应该直观而清晰,理论上,一个饼图不应该分割超过5块。下面就
陆勤_数据人网
2018/02/26
1.7K0
【数据可视化】数据可视化的正确操作方法
NHibernate 多对多映射的数据更新
最近在用 NHibernate 做多对多更新时突然发现 NHibernate 更新的策略很差, 对多对多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪, 现在还原如下:
beginor
2020/08/10
1K0
NHibernate 多对多映射的数据更新
NHibernate Contrib Best Practice
NHibernate Contrib(Burrow)是一个轻量级的开发中间件,底层使用Nhibernate 2.0GA(Nhibernate 2.0的.hbm.xml和1.2是兼容的) ORM技术框架实现。Burrow提供了智能化的状态,会话,使管理,事务让你更方便的使用Nhibernate进行.net应用程序的开发。
阿新
2019/02/13
6810
数组操作方法(包括es6数组的操作方法)[通俗易懂]
//(1)push() //向数组最里面推一个或多个数据 var arr=[“色”,”等”,”烟”,”雨”]; arr.push(“而”,’我’,”在”); console.log(arr);
全栈程序员站长
2022/08/23
5980
数组操作方法(包括es6数组的操作方法)[通俗易懂]
VIM操作方法
写文章不要那么多屁话, 要么讲道理流程控制, 要么讲操作. 不要写得跟小说流水帐一样.
用户8937598
2022/10/22
4830
[面试]说一下传统表单POST传参操作方法有哪些?
上图,来源于 敦煌壁画 考核内容: 前台与后台交互 题发散度: ★★ 试题难度: ★★ 有表单如下: 一,直接使用formData 通过对象上传时的操作 JQ通过serialize() 方法 可以对表单内容进行序列化。以键值对的方式进行呈现。适合没有上传时的操作. 以上几种方法都可以获取表单传递的数据
舒克
2023/01/30
3180
ASP.NET实体类的作用
在设计.net程序架构的时候,我更倾向于使用接口而不是实体类在作为函数的参数。 我们来看看下面这个例子:
SAP梦心
2022/05/10
6470
基于PHP函数的操作方法
//可变参数的函数(特殊用法) function sum(){ $arr = func_get_args(); $sum = 0; for($i=0;$i<count($arr);$i++){ $sum+=$arr[$i]; } echo $sum; } sum(1,2,5);
用户2323866
2021/07/01
2640
C#的DataTable操作方法
1.将泛型集合类转换成DataTable(表中无数据时使用): public static DataTable NullListToDataTable(IList list) {
彭泽0902
2018/01/04
2.1K0
Asp.Net Web API(二)
当然,你也可以创建一个Web API项目,利用 Web API模板,Web API模板使用 ASP.Net MVC提供API的帮助页。
莫问今朝
2018/08/31
2K0
Asp.Net Web API(二)
ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图。但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好。打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace MvcMovie.Models { public class Movie
葡萄城控件
2018/01/10
6.9K0
ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
Python列表操作方法
b.insert(1,'one')   #两个参数,第一个为索引,第二个为需要插入的参数值
py3study
2020/01/06
1.3K0
Git分支操作方法
Git仓库分为本地仓库和远程仓库,及时是从远程clone下来的仓库,它在本地也是独立的,它包含了你所clone分支的所有源代码和历史记录,可以方便的在本地进行操作。
拓荒者IT
2020/09/18
1K0
Git分支操作方法
点击加载更多

相似问题

从独立实体更新DB的正确方法是什么?

13

用实体更新列表的正确方法是什么?

20

如何在ASP.NET MVC中通过AJAX正确调用POST操作方法

11

使用实体框架添加或更新实体的正确方法是什么

14

使用NHibernate以正确的方式更新实体集合

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档