nhibernate以三元关系保存词典
类别: 当我使用不同的角色执行上一个命令后,我得到“已添加具有相同密钥的项”错误 有没有办法插入第二行 编辑:nhibernate以三元关系保存词典,nhibernate,Nhibernate,类别: 当我使用不同的角色执行上一个命令后,我得到“已添加具有相同密钥的项”错误 有没有办法插入第二行 编辑: 映射: 错误消息是正确的:您正在向字典添加重复的密钥 它甚至不是来自NHibernate——它是由字典类生成的 如果一个轨迹可以在多个角色中具有相同的人物,则必须将轨迹(人物)角色表映射为一个实体: UPDATE trackpeoplerole SET track_id = 47637 /* ?p0 */ WHERE people_id = 10 /* ?p1 */ AND role_
映射:
错误消息是正确的:您正在向字典添加重复的密钥 它甚至不是来自NHibernate——它是由
字典
类生成的
如果一个轨迹
可以在多个角色
中具有相同的人物
,则必须将轨迹(人物)角色
表映射为一个实体:
UPDATE trackpeoplerole SET track_id = 47637 /* ?p0 */
WHERE people_id = 10 /* ?p1 */ AND role_id = 2 /* ?p2 */
班级轨道
{
...
公共虚拟ICollection人物角色{get;set;}
}
类TrackPeopleRole
{
公共虚拟人{get;set;}
公共虚拟角色{get;set;}
}
映射:
class Track
{
...
public virtual IDictionary<People, Role> PeopleRoles { get; set; }
}
class Track
{
...
public virtual ICollection<TrackPersonRole> PeopleRoles { get; set; }
}
class TrackPeopleRole
{
public virtual Person Person { get; set; }
public virtual Role Role { get; set; }
}
...
关于
逆
和级联
还有更多的细节,但是从这个开始。我编辑了我的问题。我现在得到的是update语句,而不是insert语句
Person p = PersonManager.GetById(10);
Role pr = RoleManager.GetById(2);
Track t = TrackManager.GetById(47637);
t.PeopleRoles.Add(p, pr);
TrackManager.Save(t);
<class name="TrackPersonRole, App.Data" table="trackpeoplerole" lazy="true">
<composite-id>
<key-many-to-one name="Person" class="Person" column="people_id"/>
<key-many-to-one name="Role" class="Role" column="role_id"/>
</composite-id>
</class>
<class name="Track" ...>
...
<bag name="TrackPeopleRoles">
<key column="track_id"/>
<one-to-many class="TrackPersonRole"/>
</bag>
</class>
TrackPersonRole tpr = new TrackPersonRole();
tpr.Person = PersonManager.GetById(10);
tpr.Role = RoleManager.GetById(2);
entity.PeopleRoles.Add(tpr);
TrackManager.SaveOrUpdate(entity);
UPDATE trackpeoplerole SET track_id = 47637 /* ?p0 */
WHERE people_id = 10 /* ?p1 */ AND role_id = 2 /* ?p2 */
class Track
{
...
public virtual ICollection<TrackPersonRole> PeopleRoles { get; set; }
}
class TrackPeopleRole
{
public virtual Person Person { get; set; }
public virtual Role Role { get; set; }
}
<class name="Track" ...>
...
<bag name="TrackPeopleRoles">
<key column="track_id"/>
<one-to-many class="TrackPersonRole"/>
</map>
</class>