NHibernate不会在一对多中插入子实体

时间:2013-07-23 16:39:27

标签: nhibernate one-to-many inverse

我有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语句已终止。

我的意图是在需要引用Customer的{​​{1}}之前插入Profile个对象  宾语。这就是我使用Inverse属性的原因。不幸的是它不起作用。对此有何帮助?谢谢。

2 个答案:

答案 0 :(得分:0)

NHibernate作为一个好的ORM做的一件事就是保存关系中的所有东西,这样你就不必分开保存。我认为您的问题可能会在您说“在Profile之前插入客户对象需要引用客户”时所做的事情。

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

希望有所帮助!

答案 1 :(得分:0)

我找到了对我有用的解决方案。

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

对我而言比我之前想要实现的解决方案更好,因为我可以检查客户插入的成功,然后决定下一步做什么(保存配置文件或做一些验证错误)。

谢谢大家的回答。