我已经在“整个”internetz 中搜索了这个问题,而且由于它相当复杂,所以很难搜索。尝试搜索“Fluent NHibernate Many to Many with a bridge table with extra columns”等...
好的,为了更容易解释我可以参考的一些表格。表:用户,表:函数,表:User_Has_Function。
一个用户可以有很多功能,一个功能可以有很多用户,这在桥表User_Has_Function中链接。桥表具有仅与关系相关的额外列。
无论如何,iv 发现 FNH 没有任何自动解决方案,基本上你必须使用从 User 到 User_Has_Function 的一对多关系以及从 User_Has_Function 到 Function 的多对一关系,因此“[One] 到 [Many - Many]到[一个]”。
我已经像在这个链接http://sessionfactory.blogspot.com/2010/12/many-to-many-relationships-with.html中一样解决了它,显然只是使用 FNH 类映射而不是 xml。
但我对解决方案不满意,我真的必须手动完成所有这些工作才能使此功能正常运行吗?同样,现在它在桥接表中插入重复项。
在我的脑海中,我做错了什么,因为我无法想象没有对此的支持。只需使用 SaveAndUpdate(),不会插入重复项,当我删除实体时,关系也会被删除,如果没有留下关系,则删除实体本身等。
好的,这是我的实体和映射,我对 Fluent NHibernate 非常陌生,所以如果我做错了什么,请不要大喊大叫。:)
实体:
public class XUser
{
public virtual int Id { get; set; }
...
public virtual IList<XUserHasXFunction> XUserHasXFunctions { get; set; }
public XUser()
{
XUserHasXFunctions = new List<XUserHasXFunction>();
}
public virtual void AddXFunction(XFunction xFunction, int isActive)
{
var xUserHasXFunction = new XUserHasXFunction()
{
XUser = this,
XFunction = xFunction,
DeployedDate = DateTime.Now
};
XUserHasXFunctions.Add(xUserHasXFunction);
xFunction.XUserHasXFunctions.Add(xUserHasXFunction);
}
public virtual void RemoveXFunction(XFunction xFunction)
{
var xUserHasXFunction = XUserHasXFunctions.Single(x => x.XFunction == xFunction);
XUserHasXFunctions.Remove(xUserHasXFunction);
xFunction.XUserHasXFunctions.Remove(xUserHasXFunction);
}
}
public class XFunction
{
public virtual int Id { get; set; }
...
public virtual IList<XUserHasXFunction> XUserHasXFunctions { get; set; }
public XFunction()
{
XUserHasXFunctions = new List<XUserHasXFunction>();
}
public virtual void AddXUser(XUser xUser, int isActive)
{
var xUserHasXFunction = new XUserHasXFunction()
{
XUser = xUser,
XFunction = this,
DeployedDate = DateTime.Now
};
XUserHasXFunctions.Add(xUserHasXFunction);
xUser.XUserHasXFunctions.Add(xUserHasXFunction);
}
public virtual void RemoveXUser(XUser xUser)
{
var xUserHasXFunction = XUserHasXFunctions.Single(x => x.XUser == xUser);
XUserHasXFunctions.Remove(xUserHasXFunction);
xUser.XUserHasXFunctions.Remove(xUserHasXFunction);
}
}
public class XUserHasXFunction
{
public virtual int Id { get; set; }
public virtual XUser XUser { get; set; }
public virtual XFunction XFunction { get; set; }
public virtual DateTime DeployedDate { get; set; }
}
映射:
public class XUserMap : ClassMap<XUser>
{
public XUserMap()
{
Id(x => x.Id, "ID").GeneratedBy.Sequence("SEQ").Column("ID");
Table("XUSER");
...
HasMany(x => x.XUserHasXFunctions).Cascade.All();
}
}
public class XFunctionMap : ClassMap<XFunction>
{
public XFunctionMap()
{
Id(x => x.Id, "ID").GeneratedBy.Sequence("SEQ").Column("ID");
Table("XFUNCTION");
...
HasMany(x => x.XUserHasXFunctions).Cascade.All();
}
}
public class XUserHasXFunctionMap : ClassMap<XUserHasXFunction>
{
public XUserHasXFunctionMap()
{
Id(x => x.Id, "ID").GeneratedBy.Sequence("SEQ").Column("ID");
Table("USER_HAS_FUNCTION");
Map(x => x.DeployedDate, "DEPLOYED_DATE");
References(x => x.XUser).ForeignKey("XUSER_ID").Cascade.SaveUpdate();
References(x => x.XFunction).ForeignKey("XFUNCTION_ID").Cascade.SaveUpdate();
}
}