我有一个父子关系,我已经把测试用例放在用户和用户组之间。我这样做是为了在尝试使用关系执行cacade插入时复制父亲 - 子女关系中的故障 。流利NHibernate父子级联SaveOrUpdate失败
两个SQL表如下所示:
CREATE TABLE [dbo].[User]
(
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [varchar](50) NOT NULL,
)
CREATE TABLE [dbo].[Group]
(
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[GroupName] [varchar](50) NOT NULL,
[UserId] [int] NOT NULL,
)
ALTER TABLE [dbo].[Group] WITH CHECK ADD CONSTRAINT [FK_Group_User] FOREIGN KEY([UserId])
REFERENCES [dbo].[User] ([Id])
的对象表示这两个表具有以下映射:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("[User]");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).Not.Nullable();
HasMany(x => x.Groups).KeyColumn("UserId").Cascade.SaveUpdate();
}
}
public class GroupMap : ClassMap<Group>
{
public GroupMap()
{
Table("[Group]");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.GroupName).Not.Nullable();
References(x => x.User).Column("UserId").Not.Nullable();
}
}
的代码创建的对象仅仅是:
用户u =新用户(){姓名=“测试”}; Group g = new Group(){GroupName =“Test Group”}; u.Groups.Add(g);
using (var session = factory.OpenSession())
{
session.SaveOrUpdate(u);
}
但是它失败,出现异常“无法将NULL值插入列‘用户ID’,表‘test.dbo.Group’;列不允许空INSERT失败 的语句已终止。”。我怀疑这是dude父对象的Id(一个标识列)作为NULL传递,而不是新的值。这是一个错误还是有办法解决这些映射,以便这个级联关系成功?
这正是我所做的解决方法。不过,我会认为这种亲子关系是相当普遍的,因此会得到照顾。 – Dion 2010-11-02 19:48:43