asp.net-mvc – 从asp.net POST动作方法更新nhibernate实体的正
| 我是nHibernate的新手,并试图通过正确的方式从Web应用程序表单POST更新分离的对象. (我们使用的是ASP.NET MVC) 
  
  我正在尝试更新的对象包含(除其他外)IList的子对象,映射的内容如下: <bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
      <key column="JobNumber" />
      <one-to-many class="SliceClass" />
</bag>我们已经安排了我们的MVC编辑视图表单,以便当它被回发时,我们的操作方法被传递给对象(包括子项的List<>)我们通过表单正确地往返所有实体ID. 我们对post动作方法的天真尝试执行session.SaveOrUpdate(parentObject),其中parentObject已被默认的modelbinder从视图窗体中删除. 对于以下任何一种情况,这似乎都可以正常工作: >创建新的父对象 失败的情况是: 我的理解是,这是因为nHibernate为创建需要删除的子列表而执行的魔法不适用于分离的实例. 我无法找到一个简单的例子,说明使用nHibernate这种行为方法应该是什么样的(即使用模型绑定器对象作为分离的nHibernate实例) – 基于MS EF的示例(例如http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx)似乎使用了方法’ApplyPropertyChanges’将已更改的属性从模型绑定对象复制到重新加载的实体实例. 所以,经过这一切,问题很简单 – 如果我有模型绑定器给我一个包含子对象集合的新对象,我应该如何通过nHibernate更新它(其中’update’包括可能删除子节点)? 解决方法
 这是一个我认为你想做的事情的例子.如果我误解了你想要做的事,请告诉我. 
  
  鉴于以下“域”类: 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; }
}使用以下映射: 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);
        }
    }这个测试: [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:INSERT INTO [Pet](Name,@ p1); @ p0 =’dog’,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’ NHibernate:INSERT INTO [Pet](Name,@ p1); @ p0 =’cat’,@ p1 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’ NHibernate:UPDATE [Pet] SET Person_id = @ p0 WHERE Id = @ p1; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’ NHibernate:UPDATE [Pet] SET Person_id = @ p0 WHERE Id = @ p1; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′,@ p1 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’ NHibernate:SELECT person0_.Id as Id5_0_,person0_.Name as Name5_0_ FROM [Person] person0_ WHERE person0_.Id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′ NHibernate:SELECT pets0_.Person_id as Person3_1_,pets0_.Id as Id1_,pets0_.Id as Id6_0_,pets0_.Name as Name6_0_ FROM [Pet] pets0_ WHERE pets0_.Person_id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′ NHibernate:UPDATE [Person] SET Name = @ p0 WHERE Id = @ p1; @ p0 =’被驱逐’,@ p1 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′ NHibernate:UPDATE [Pet] SET Name = @ p0 WHERE Id = @ p1; @ p0 =’dog’,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’ NHibernate:DELETE FROM [Pet] WHERE Id = @ p0; @ p0 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’ NHibernate:SELECT person0_.Id as Id5_0_,pets0_.Name as Name6_0_ FROM [Pet] pets0_ WHERE pets0_.Person_id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′ 注意DELETE FROM [Pet] …… 所以,你需要能够做的是手工操作一个Person对象(在这个例子中)与修改后的集合,它应该能够确定要删除的内容.确保设置了Cascade.AllDeleteOrphan()属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
- asp.net-mvc – 使用EF Code First和ASP.NET MVC部分更新对
- ASP.Net程序员应该为代码灵感提供哪些其他框架?
- asp.net-mvc-3 – 日期选择器透明背景开箱即用?
- asp.net-mvc – 动态生成sitemap.xml
- asp.net – 如何在.NET中调用服务器端事件
- asp.net-mvc – 在MVC中使用Rotativa pdf显示动态标头
- asp.net-mvc – 在EF 6中设置命令超时
- 在后面的asp.net代码中使用web服务的最佳方法
- asp.net – 如何修改aspx页面的超时?
- asp.net – RazorViewEngine.FindView无法找到预编译的视图
- asp.net-mvc – jQuery.POST – 使用Form.Serial
- asp.net-mvc – ASP.NET MVC和ViewState
- ASP.NET Core技术研究-全面认识Web服务器Kestrel
- asp.net – ASP MVC – 创建目录路径而不是文件路
- asp.net-mvc – ASP.Net Mvc固定长度字符串数据注
- asp.net – Web Forms错误消息:“这不是scriptl
- 确定ASP.NET中是否启用了Cookie的最佳方式?
- asp.net-core – 如何使用ASP.NET CORE在视图中获
- Autofac和ASP.NET Web API ApiController
- asp.net-web-api – 我是否使用正确的终身经理进
