【问题标题】:NHibernate not inserting child entities in one-to-manyNHibernate 没有在一对多中插入子实体
【发布时间】:2013-07-24 19:05:06
【问题描述】:

我有 CustomerProfile 类,其中一个客户可以有多个配置文件。

我正在使用以下 NHibernate 覆盖类:

 public void Override(AutoMapping<Customer> mapping)
    {
        mapping.Table("[Customer]");
        mapping.Id(x => x.Id, "Id").GeneratedBy.Identity();

        mapping.HasMany(x => x.Profiles).Cascade.All().Inverse();

        mapping.Map(x => x.FirstName, "FirstName");
        mapping.Map(x => x.LastName, "LastName");
        mapping.Map(x => x.Email, "Email");            
    }

public void Override(AutoMapping<Profile> mapping)
    {
        mapping.Table("[Profile]");
        mapping.Id(x => x.Id, "Id").GeneratedBy.Identity();

        mapping.References(x => x.Customer, "Customer_Id").Cascade.None();

        mapping.Map(x => x.FacebookProfileLink, "FacebookProfileLink");
        mapping.Map(x => x.ContactPhone, "ContactPhone");          
    }

插入Profile 对象时出现以下错误:

无法将值 NULL 插入到列“Customer_Id”、表“dbo.Profile”中;列不允许空值。 INSERT 失败。\r\n语句已终止。

我的意图是在需要引用CustomerProfile 之前插入Customer 对象 目的。这就是我使用 Inverse 属性的原因。不幸的是,它不起作用。对此有什么帮助吗?谢谢。

【问题讨论】:

    标签: nhibernate one-to-many inverse


    【解决方案1】:

    NHibernate 作为一个好的 ORM 所做的一件事是保存关系中的所有内容,这样您就不必单独保存。我认为您的问题可能在于您说“在需要引用客户的配置文件之前插入客户对象”时所做的事情。

    实际情况是,您应该创建客户,并使用需要与之关联的配置文件,然后保存客户。 NHibernate 将以正确的顺序保存所有实体以确保保留关系。尝试这样做,首先创建或检索客户实体,然后添加/删除配置文件,然后保存客户。由于您在映射中指定的级联选项,配置文件将被保存。

    希望有帮助!

    【讨论】:

    • 感谢您的回复。刚刚尝试过(通过添加的配置文件保存客户),不幸的是错误仍然完全相同:(
    【解决方案2】:

    我找到了适合我的解决方案。

    我正在保存客户实体而不参考它的配置文件。之后我保存个人资料实体。

    比我之前想要实现的解决方案更适合我,因为我可以检查客户插入是否成功,然后决定下一步做什么(也保存个人资料或做一些验证错误)。

    谢谢大家的回答。

    【讨论】:

    • 很高兴有人为您的问题发布了解决方案。请标记您选择的答案。
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2015-03-29
    • 2012-08-29
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2011-10-09
    • 2011-07-21
    相关资源
    最近更新 更多