你介意帮助我更好地理解如何处理我的实体和 NHibernate 之间的关系吗?
我很难理解我需要手动执行哪些操作,以及 NHibernate 将为我执行哪些操作(或不执行)。
我有这两个实体:
public class Position : BaseEntity<int, Position>
{
private IList<Player> allPlayers = new List<Player>();
public Position()
{
}
public Position(string name, int number)
: this()
{
Name = name;
Number = number;
}
public string Name { get; set; }
public int Number { get; set; }
}
和
public class Player : BaseEntity<int, Player>
{
public Player()
{
Visible = true;
}
public Player(string firstName, string lastName, int defaultNumber, Sex sex = Sex.Male, Position defaultPosition = null)
: this()
{
FirstName = firstName;
LastName = lastName;
DefaultNumber = defaultNumber;
Sex = sex;
DefaultPosition = defaultPosition;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public Position DefaultPosition { get; set; }
}
以下是流畅的映射:
public class PositionMap : ClassMap<Position>
{
public PositionMap()
{
Id(pp => pp.Id)
.GeneratedBy.Increment();
Map(pp => pp.Name)
.Not.Nullable();
Map(pp => pp.Number)
.Not.Nullable();
HasMany<Player>(Reveal.Member<Position>("allPlayers"))
.Access.CamelCaseField();
}
}
public class PlayerMap : ClassMap<Player>
{
public PlayerMap()
{
Table("Players");
Id(p => p.Id)
.GeneratedBy.Increment();
Map(p => p.FirstName)
.Not.Nullable()
.UniqueKey("Players_Unique_FirstName_LastName");
Map(p => p.LastName)
.Not.Nullable()
.UniqueKey("Players_Unique_FirstName_LastName");
References(p => p.DefaultPosition);
}
}
如您所见,一名玩家拥有一个位置,但可能没有位置(因此 DefaultPosition 可以为空)。
以下是我的问题:
- 当我将位置与玩家的 DefaultPosition 相关联时,我必须通过 Position 上的辅助方法来执行此操作吗?(如 AddPlayer、DeletePlayer...)
我希望,当我删除一个位置时,所有拥有该位置的玩家都有一个空的 DefaultPosition。
我是否必须手动清除该位置的 allPlayers 字段,并将所有关联玩家的 DefaultPosition 手动设置为 null,或者 NHibernate 可以为我处理这个问题吗?
为什么 NHibernate 只执行DELETE FROM Positions WHERE Id...而不会更新相关玩家的字段 DefaultPOsition?我试图在 PositionMap 的 HasMany 上添加 Cascade.Delete,但这并没有改变任何东西。我是否必须运行一个自定义查询来做到这一点?
提前致谢