我使用的是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)?
它实际上是映射,它反转了数据库中的ProjectId
和UserId
列:
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();
答案 0 :(得分:2)
我注意到您正在命名列(ParentKeyColumn
和ChildKeyColumn
)。如果您只是为自己命名并呼叫Inverse()
或Cascade.All()
,那么它将按您的意愿运行,因为流利的nhibernate将创建两个列并自行管理。
在 ProjectMap 上,您可以执行以下操作:
HasManyToMany(x => x.UserList).Table("TBPROJECTUSER").Inverse();
并在您的 UserMap 上,您可以执行以下操作:
HasManyToMany(x => x.ProjectList).Table("TBPROJECTUSER").Cascade.All();