[英]Problem mapping reference to composite key with Fluent NHibernate
[英]Fluent NHibernate Composite ID table problem
我對 nhibernate 有點陌生,我遇到了問題。 我有以下表格:
表 1:表名稱:用戶,第 1 列: ID,第 2 列:名稱
表 2:表名稱:任務,第 1 列: ID,第 2 列:描述
表 3:表名: UserToDoMissions,第 1 列: UserID,第 2列:MissionID,第 3 列:排名
這是代碼:MissionMap:
public class MissionMap : ClassMap<Mission>
{
public const string TableName = "tblMissions";
public const string c_id = "achID";
public const string c_name = "achName";
public MissionMap()
{
Table(TableName);
Id(x => x.ID).Column(c_id).Not.Nullable();
Map(x => x.Name).Column(c_name).Not.Nullable();
HasMany(x => x.UserToDoList).Cascade.All().Inverse().KeyColumn(UserToDoMap.c_missionID);
}
}
用戶 Map:
public class UserMap : ClassMap<User>
{
public const string TableName = "tblUsers";
public const string c_id = "usrID";
public const string c_userName = "usrUserName";
public UserMap()
{
Table(TableName);
Id(x => x.ID).Column(c_id).Not.Nullable();
Map(x => x.UserName).Column(c_userName).UniqueKey(DBConsts.UniqueKeys.User_UserName).Not.Nullable();
HasMany(x => x.UserToDoList).Cascade.All().Inverse().KeyColumn(UserToDoMap.c_userID);
}
}
用戶待辦 Map:
public class UserToDoMap : ClassMap<UserToDo>
{
public const string TableName = "tblToDoList";
public const string c_userID = "tdlUserID";
public const string c_missionID = "tdlMissionID";
public const string c_rank = "tdlRank";
public UserToDoMap()
{
Table(TableName);
CompositeId().KeyReference(x => x.User, c_userID).KeyReference(x => x.Achievment, c_missionID);
References(x => x.User).Column(c_userID).Cascade.All().UniqueKey(DBConsts.UniqueKeys.ToDoList_UserRanks).Not.Nullable();
References(x => x.Mission).Column(c_missionID).Cascade.All().Not.Nullable();
Map(x => x.Rank).Column(c_rank).UniqueKey(DBConsts.UniqueKeys.ToDoList_UserRanks).Not.Nullable();
}
}
我的問題是我不能保存新行。 我可以 select 並獲得所有東西但無法保存。 有任何想法嗎?
謝謝。
編輯:我什么也沒得到。 不會引發異常,但不會將行添加到數據庫中。 順便說一句,我在 UserToDo object 上使用保存方法。
編輯2:在docmanhattan回答之后是代碼:
用戶待辦地圖:
public class UserToDoMap : ClassMap<UserToDo>
{
public const string TableName = "tblToDoList";
public const string c_userID = "tdlUserID";
public const string c_missionID = "tdlMissionID";
public const string c_rank = "tdlRank";
public UserToDoMap()
{
Table(TableName);
CompositeId<UserToDoId>(x => x.ID)
.KeyReference(x => x.UserIdPart, c_userID)
.KeyReference(x => x.MissionIdPart, c_missionID);
References(x => x.ID.UserIdPart).Column(c_userID).Cascade.All().UniqueKey(DBConsts.UniqueKeys.ToDoList_UserRanks).Not.Nullable();
References(x => x.ID.MissionIdPart).Column(c_missionID).Cascade.All().Not.Nullable();
Map(x => x.Rank).Column(c_rank).UniqueKey(DBConsts.UniqueKeys.ToDoList_UserRanks).Not.Nullable();
}
}
UserToDoId 實體:
public class UserToDoId
{
public virtual User UserIdPart { get; set; }
public virtual Mission MissionIdPart { get; set; }
public override bool Equals(object obj)
{
UserToDoId recievedObject = (UserToDoId)obj;
if ((UserIdPart.ID == recievedObject.UserIdPart.ID) &&
(MissionIdPart.ID == recievedObject.MissionIdPart.ID))
{
return (true);
}
return (false);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
UserToDo 實體:
public class UserToDo
{
public virtual UserToDoId ID { get; set; }
public virtual int Rank { get; set; }
public UserToDo()
{
}
public override bool Equals(object obj)
{
UserToDo recievedObject = (UserToDo)obj;
if ((ID.UserIdPart.ID == recievedObject.ID.UserIdPart.ID) &&
(ID.MissionIdPart.ID == recievedObject.ID.MissionIdPart.ID) &&
(Rank == recievedObject.Rank))
{
return (true);
}
return (false);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
當我嘗試創建 session 工廠時出現異常:
{“在 class 'DatabaseEntities.UserToDo' 中找不到屬性 'UserIdPart' 的 getter”}
我在使用復合 id 做事情時遇到了很多問題,例如this 。 我建議做我所做的,即創建一個新類型,它只包含復合 id 用於 id 的內容,然后像這樣映射它:
CompositeId<UserToDoId>(x => x.ID)
.KeyReference(x => x.UserIdPart, c_userID)
.KeyReference(x => x.AchievementIdPart, c_missionID);
其中 UserToDoId 具有復合 id 中使用的兩個引用:
public class UserToDoId
{
User UserIdPart { get; set; }
Achievement AchievementIdPart { get; set; }
public override bool Equals(object obj)
{
return Equals(obj as UserToDoId);
}
private bool Equals(UserToDoId other)
{
if (ReferenceEquals(other, null)) return false;
if (ReferenceEquals(other, this)) return true;
return UserIdPart.ID == other.UserIdPart.ID &&
MissionIdPart.ID == other.MissionIdPart.ID;
}
public override int GetHashCode()
{
unchecked
{
int hash = GetType().GetHashCode();
hash = (hash * 31) ^ UserIdPart.ID.GetHashCode();
hash = (hash * 31) ^ MissionIdPart.ID.GetHashCode();
return hash;
}
}
}
我不知道為什么,但是當你不使用其他類型來保存組件 id 的各個部分時,會出現一堆小問題。
我遇到的一個問題在一開始就與我的答案有關。 我使用的另一個是父抽象 class 的復合 id 與子類映射將嘗試為某些查詢創建抽象 class 的實例(你不能這樣做)。 實施這種新類型解決了這兩個問題。
試一試,看看是否有效。 此外,“成就”拼寫為“成就”(不是想嘲諷,我只是希望你會避免人們因為拼寫錯誤而嘲笑你的代碼:-D)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.