我定义了以下数据库表:
Club:Id,Name
成员:Id,姓名
ClubMember:ClubId,MemberId
我定义了以下实体类:
public class Club() {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Member> Members { get; set; }
}
public class Member() {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Club> Clubs { get; set; }
}
我定义了以下覆盖:
public class MemberOverride : IAutoMappingOverride<Member>
{
public void Override(AutoMapping<Member> mapping_)
{
mapping_
.HasManyToMany(x_ => x_.Clubs)
.ParentKeyColumn("MemberId")
.ChildKeyColumn("ClubId")
.Cascade.All()
.Table("ClubMembers");
}
}
public class ClubOverride : IAutoMappingOverride<Club>
{
public void Override(AutoMapping<Club> mapping_)
{
mapping_
.HasManyToMany(x_ => x_.Members)
.ParentKeyColumn("ClubId")
.ChildKeyColumn("MemberId")
.Inverse()
.Table("ClubMembers");
}
}
我可以从我的覆盖中看到,ClubOverride上的Inverse意味着您无法执行以下操作
session.Save(club.Members.Add(member));
但这有效:
session.Save(member.Clubs.Add(club);
但它没有逻辑意义。我希望能够将会员或会员与俱乐部一起保存。
我是否尝试使用FluentNhibernate做一些不可能的事情?
TIA
答案 0 :(得分:3)
是的,你是对的,这是不可能的。但这不是FluentNhibernate的问题,NHibernate就是这样的。
只有一方是该关系的所有者并负责添加元素。
来自官方文件:
仅对关联的反向结束所做的更改不会保留。这意味着NHibernate在内存中有两个表示形式,用于每个双向关联,一个链接从A到B,另一个链接从B到A.如果你考虑.NET对象模型以及我们如何创建一个多对象,这将更容易理解。 - C#中的很多关系:
答案 1 :(得分:3)
您可以在实体上创建有助于实现此目的的添加或删除方法:
public class Club() {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
private IList<Member> members;
public virtual IEnumerable<Member> Members { get { return members.Select(x => x); } }
public Club() {
members = new List<Member>();
}
public virtual void AddMember(Member member){
if (members.Contains(member))
return;
members.Add(user);
member.AddClub(this);
}
public virtual void RemoveMember(Member member){
if (!members.Contains(member))
return;
members.Remove(member);
member.RemoveClub(this);
}
}