gpt4 book ai didi

nhibernate - Fluent NHibernate 父子级联 SaveOrUpdate 失败

转载 作者:行者123 更新时间:2023-12-02 07:50:36 25 4
gpt4 key购买 nike

我有一个父子关系,我在用户和组之间放置了一个测试用例。我这样做是为了复制失败尝试使用这些关系执行级联插入时的父子关系。

两张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();
}
}

创建对象的代码很简单:

User u = new User() { Name = "test"}; Group g = new Group() { GroupName = "测试组"}; u.Groups.Add(g);

    using (var session = factory.OpenSession())
{
session.SaveOrUpdate(u);
}

但是它失败并出现异常“无法将值 NULL 插入列‘UserId’,表‘test.dbo.Group’;列不允许空值。INSERT 失败。该语句已终止”。我怀疑这是因为父对象的 Id(一个标识列)作为 NULL 而不是新值传递。这是一个错误还是有办法修复这些映射,以便这个级联成功?

最佳答案

我最近在一个项目中使用了这种精确类型的映射。我的建议是:

  • 了解 HasMany 关系的反向属性的工作原理。 Great explanation here
  • 您需要在父对象和子对象之间建立双向关联。上面链接的文章底部对此进行了解释。

另一个好建议是更好地封装你的集合- 不要直接访问您的集合修改方法。集合属性应该是只读的,父类(在您的情况下是用户类)应该具有更改私有(private)集合的 AddGroup() 和 RemoveGroup() 方法。为了让它工作,你必须让 NHibernate 通过使用 .Access.CamelCaseField(Prefix.Underscore) 或类似的映射属性来访问私有(private)集合成员。 Good discussion about it here

如果需要,我可以发布示例映射和类文件。

关于nhibernate - Fluent NHibernate 父子级联 SaveOrUpdate 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com