如何在Fluent-NHibernate中级联插入父,子和组合列表

时间:2014-05-22 14:51:58

标签: c# sqlite nhibernate fluent-nhibernate

我使用的是SQLite,而且我使用了这三个表:

User (Id, Name) Project (Id, Name) ProjectUser (UserId, ProjectId)

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

在我的模型User中有一个Project列表,Project列有User,一个many-to-many relationship

如何创建User的新实例,Project的新实例,在用户的ProjectList中添加项目,并在session.Save(NewUser)时插入所有(user,project和userproject)?

它实际上是映射,它反转了数据库中的ProjectIdUserId列:

P.S:

  • 我试图反转父/子列名称的顺序并尝试过 将Inverse()删除或放入所有组合中,有时我也是如此 得到了这个错误:Abort due to constraint violation\r\nforeign key constraint failed而另一次我遇到了同样的问题 反转列。

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

PROJECTMAP

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();

1 个答案:

答案 0 :(得分:2)

我注意到您正在命名列(ParentKeyColumnChildKeyColumn)。如果您只是为自己命名并呼叫Inverse()Cascade.All(),那么它将按您的意愿运行,因为流利的nhibernate将创建两个列并自行管理。

ProjectMap 上,您可以执行以下操作:

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

并在您的 UserMap 上,您可以执行以下操作:

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