...我已經尋找這個問題的「整體」 internetz,它的一個該死的努力之一,其相當複雜的搜索。嘗試搜索「功能NHibernate多對多與額外的列的橋樑表」等...功能NHibernate M2M映射([大]至[許多 - 許多]到[一])
好,使之更容易解釋生病定義一些表可以參考我。 表:用戶,表:函數,表:User_Has_Function。
一個用戶可以有很多功能,並且功能可以有很多用戶,這是在橋牌桌上User_Has_Function鏈接。橋表有額外的列,這隻與關係有關。
不管怎樣,iv發現FNH沒有任何自動解決方案,基本上你必須使用從User到User_Has_Function和從User_Has_Function到Function的一對多關係,因此「[One] to [許多 - 許多]到[一個]「。
我已經在這個環節http://sessionfactory.blogspot.com/2010/12/many-to-many-relationships-with.html解決它像剛剛與FNH類的映射,而不是XML明顯。
但我不是滿意的解決方案,我真的需要做的這一切手動工作,以使該功能正常嗎?同樣,現在它將在橋表中插入重複項。
在我的腦海裏我做錯了什麼,因爲我無法想象有沒有這方面的支持。只需使用SaveAndUpdate(),不插入重複項,當我刪除實體時,關係也被刪除,如果沒有關係,則刪除實體本身等。流利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();
}
}
好代碼,你希望別人看到代碼,你把它放在他們面臨炫耀你輝煌。我寫的代碼解決了這個問題,id從來沒有向任何人展示過,這就是我的感受......而且這不是你應該寫代碼的方式,這是不好的做法。 – furier