【发布时间】:2012-05-30 10:19:25
【问题描述】:
我已经在“整个”internetz 中搜索了这个问题,而且由于它相当复杂,所以很难搜索。尝试搜索“Fluent NHibernate Many to Many with a bridge table with extra columns”等...
好的,为了便于解释,我定义了一些我可以参考的表格。 表:用户,表:函数,表:User_Has_Function。
一个User可以有很多Function,一个Function可以有很多User,这在桥表User_Has_Function中链接。桥接表具有仅与关系相关的额外列。
无论如何,iv 发现 FNH 没有任何自动解决方案,基本上你必须使用从 User 到 User_Has_Function 的一对多关系以及从 User_Has_Function 到 Function 的多对一关系,因此“[One] 到 [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();
}
}
【问题讨论】:
-
好的代码是你想让别人看到的代码,你把它放在他们的脸上来炫耀你的才华。我为解决这个问题而编写的代码,我宁愿从不向任何人展示,这就是我的感受......这不是你对编写代码的感觉,这是一种不好的做法 imo。
标签: c# orm fluent-nhibernate