0

我有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对象之前插入 对象。这就是我使用 Inverse 属性的原因。不幸的是,它不起作用。对此有什么帮助吗?谢谢你。ProfileCustomer

4

2 回答 2

0

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

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

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

谢谢大家的答案。

于 2013-07-24T11:05:06.483 回答
0

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

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

希望有帮助!

于 2013-07-23T18:01:50.267 回答