我有Customer
和Profile
个类,其中一个客户可以拥有多个个人资料。
我正在使用以下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属性的原因。不幸的是它不起作用。对此有何帮助?谢谢。
答案 0 :(得分:0)
NHibernate作为一个好的ORM做的一件事就是保存关系中的所有东西,这样你就不必分开保存。我认为您的问题可能会在您说“在Profile之前插入客户对象需要引用客户”时所做的事情。
现实情况是,您应该创建客户,并将需要的配置文件与其关联,然后只需保存客户。 NHibernate将以正确的顺序保存所有实体,以确保保持关系。尝试这样做,首先创建或检索客户实体,然后添加/删除配置文件,然后保存客户。由于您在映射中指定了级联选项,因此将保存配置文件。
希望有所帮助!
答案 1 :(得分:0)
我找到了对我有用的解决方案。
我正在保存客户实体而不参考其配置文件。之后我正在保存个人资料实体。
对我而言比我之前想要实现的解决方案更好,因为我可以检查客户插入的成功,然后决定下一步做什么(保存配置文件或做一些验证错误)。
谢谢大家的回答。