C# 如何在Fluent NHibernate中级联插入父项、子项和组合列表

C# 如何在Fluent NHibernate中级联插入父项、子项和组合列表,c#,sqlite,nhibernate,fluent-nhibernate,C#,Sqlite,Nhibernate,Fluent Nhibernate,我使用的是SQLite,我有以下三个表: 用户(Id、名称) 项目(Id、名称) ProjectUser(UserId,ProjectId) 但在我的映射中,我只有两个类映射:UserMap映射用户和ProjectMap映射项目 在我的机型中,用户有一个项目列表,项目有一个用户列表,一个多对多关系 如何创建新的用户实例、新的项目实例、将项目添加到用户的项目列表中以及在我会话时插入所有(用户、项目和用户项目)。保存(新用户) 它实际上是my映射,它将数据库上的ProjectId和UserId列反转

我使用的是SQLite,我有以下三个表:

用户(Id、名称)
项目(Id、名称)
ProjectUser(UserId,ProjectId)

但在我的映射中,我只有两个类映射:
UserMap
映射用户和
ProjectMap
映射项目

在我的机型中,
用户
有一个
项目
列表,
项目
有一个
用户
列表,一个
多对多关系

如何创建新的用户实例、新的项目实例、将项目添加到用户的项目列表中以及在我
会话时插入所有(用户、项目和用户项目)。保存(新用户)

它实际上是my映射,它将数据库上的
ProjectId
UserId
列反转为:

p.S:

  • 我尝试颠倒父/子列名称的顺序,并尝试 在所有组合中删除或放置
    Inverse()
    ,有时我 出现此错误:
    由于约束冲突而中止\r\n保留密钥
    约束失败了
    ,还有一次我也遇到了同样的问题 将柱倒置

  • 我尝试在每个连接打开后使用自己的代理执行
    PRAGMA foreign_keys=ON

项目地图

Table("TBPROJECT");
        Id(x => x.Id);
        Map(x => x.ProjectName).Length(100).Not.Nullable();
        Map(x => x.TeamProjectURL).Length(100).Not.Nullable();

        HasManyToMany(x => x.UserList).Table("TBPROJECTUSER").ParentKeyColumn("UserId").ChildKeyColumn("ProjectId").Inverse();
Table("TBUSER");
        Id(x => x.Id);
        Map(x => x.FullName).Length(100).Not.Nullable();
        Map(x => x.Username).Length(100).Not.Nullable();
        Map(x => x.Email).Length(100).Not.Nullable();
        Map(x => x.Password).Length(100).Nullable();
        Map(x => x.Department).Length(100).Nullable();

        HasManyToMany(x => x.ProjectList).Table("TBPROJECTUSER").ParentKeyColumn("UserId").ChildKeyColumn("ProjectId").Cascade.All();
USERMAP

Table("TBPROJECT");
        Id(x => x.Id);
        Map(x => x.ProjectName).Length(100).Not.Nullable();
        Map(x => x.TeamProjectURL).Length(100).Not.Nullable();

        HasManyToMany(x => x.UserList).Table("TBPROJECTUSER").ParentKeyColumn("UserId").ChildKeyColumn("ProjectId").Inverse();
Table("TBUSER");
        Id(x => x.Id);
        Map(x => x.FullName).Length(100).Not.Nullable();
        Map(x => x.Username).Length(100).Not.Nullable();
        Map(x => x.Email).Length(100).Not.Nullable();
        Map(x => x.Password).Length(100).Nullable();
        Map(x => x.Department).Length(100).Nullable();

        HasManyToMany(x => x.ProjectList).Table("TBPROJECTUSER").ParentKeyColumn("UserId").ChildKeyColumn("ProjectId").Cascade.All();

我注意到您正在命名列(
ParentKeyColumn
ChildKeyColumn
)。如果您只是命名表并调用
Inverse()
Cascade.All()
,它将根据您的需要工作,因为fluent nhibernate将创建两个列并自行管理

在项目地图上,您可以执行以下操作:

HasManyToMany(x => x.UserList).Table("TBPROJECTUSER").Inverse();
HasManyToMany(x => x.ProjectList).Table("TBPROJECTUSER").Cascade.All();
在您的用户地图上,您可以执行以下操作:

HasManyToMany(x => x.UserList).Table("TBPROJECTUSER").Inverse();
HasManyToMany(x => x.ProjectList).Table("TBPROJECTUSER").Cascade.All();