Не могли бы вы помочь мне лучше понять, что делать с отношениями между моими сущностями и NHibernate?
У меня есть некоторые трудности, чтобы понять, какие операции мне нужно делать вручную, и какие операции NHibernate будет делать для меня (или нет).
У меня есть 2 сущности:
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 ...)
Мне бы хотелось, чтобы при удалении позиции все игроки, имеющие эту позицию, вместо этого имели нулевую позицию по умолчанию.
Должен ли я вручную очистить поле allPlayers от позиции и вручную установить значение null в DefaultPosition всех связанных игроков, или NHibernate позаботится об этом для меня?
Почему NHibernate только УДАЛЯЕТ из позиций ГДЕ Id ... и не обновляет поле DefaultPOsition соответствующих игроков? Я пытался добавить Cascade.Delete на HasMany в PositionMap, но это ничего не меняет. Должен ли я выполнить пользовательский запрос, который делает это?
Заранее спасибо