首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Fluent NHibernate级联删除不起作用

Fluent NHibernate级联删除不起作用
EN

Stack Overflow用户
提问于 2010-10-26 03:02:55
回答 2查看 17.4K关注 0票数 18

我有一个使用Fluent NHibernate 1.1的简单的电话目录应用程序。在应用程序中,一个"Person“对象有许多"PhoneNumber”对象。我正在尝试删除一个人,并且我想将删除操作级联到PhoneNumbers。在阅读了this answer之后,我设置了DefaultCascade.All()的约定。但是,尝试删除父对象仍然会抛出一个异常-- NHibernate似乎正在尝试更新子表,以将父ID设置为null,而不仅仅是删除记录:

{“无法删除集合: Person.PhoneNumbers#473"}

InnerException:

{“无法将值NULL插入到表‘directory.dbo.phone_numbers’的'person_id‘列;列不允许为NULL。更新失败。\r\n该语句已终止。”}

我流利的配置是:

代码语言:javascript
运行
复制
public static ISessionFactory CreateSessionFactory() {
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["activeConnStr"]].ConnectionString))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()
                                        .Conventions.Add(DefaultCascade.All())
                    )
        .BuildSessionFactory();
}

父类是:

代码语言:javascript
运行
复制
public class Person {
    public Person() {
        PhoneNumbers = new List<PhoneNumber>();
        EmailAddresses = new List<string>();
    }

    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Company { get; set; }
    public virtual IList<PhoneNumber> PhoneNumbers { get; set; }
    public virtual IList<string> EmailAddresses { get; set; }
}

子类(PhoneNumber)是:

代码语言:javascript
运行
复制
public class PhoneNumber {
    public virtual string Number { get; set; }
    public virtual PhoneNumberType NumberType { get; set; }
    public virtual Person Person { get; set; }
}

我删除一个人的代码是:

代码语言:javascript
运行
复制
public static void DeletePerson(int id) {
    using (var session = Dalc.Instance.SessionFactory.OpenSession()) {
        using (var trans = session.BeginTransaction()) {
            session.Delete(session.Load<Person>(id));
            trans.Commit();
        }
    }
}

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-26 09:28:11

我不确定如何配置Fluent部分,但我最近在使用ActiveRecord时遇到了同样的问题。

您需要将Person端的关联设置为Inverse = true

通过查看Getting Started文档...

我相信,当你亲自定义你的HasMany关系时,你需要设置这个。它应该看起来像这样:

代码语言:javascript
运行
复制
public PersonMap()
{
    //<...SNIP...>
    HasMany(x => x.PhoneNumbers)
      .Inverse();
    //<...SNIP...>
}
票数 31
EN

Stack Overflow用户

发布于 2012-08-16 13:39:28

它是有效的;下面是每个级联选项的含义:

none -不要做任何级联,让用户自己处理它们。

保存-更新关联-保存/更新对象时,检查关联并保存/更新任何需要它的对象(包括在多对多情况下保存/更新关联)。

删除关联( delete )-删除对象时,删除关联中的所有对象。

孤立删除-孤立-删除对象时,删除关联中的所有对象。除此之外,当一个对象从关联中删除并且不与另一个对象(孤立的)相关联时,也要删除它。

all -保存/更新/删除对象时,检查关联并保存/更新/删除找到的所有对象。

all-delete-orphan -当对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。除此之外,当一个对象从关联中删除并且不与另一个对象(孤立的)相关联时,也要删除它。

代码语言:javascript
运行
复制
public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Table("Person");

        Id(x => x.Id);
        Map(x => x.Name);

        HasMany<PhoneNumber>(x => x.PhoneNumberList)
            .KeyColumn("PersonId")
            .Cascade.All()
            .Inverse().LazyLoad();
    }
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4017901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档