не могли бы вы помочь мне лучше понять, что делать с отношениями между моими сущностями и 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 может принимать значение NULL).
Вот мои вопросы:
- Когда я связываю позицию с DefaultPosition игрока, я должен делать это с помощью вспомогательных методов в Position? (например, AddPlayer, DeletePlayer...)
Я хотел бы, чтобы при удалении позиции все игроки, у которых есть эта позиция, вместо этого имели нулевое значение DefaultPosition.
Должен ли я вручную очищать поле allPlayers позиции и вручную устанавливать нуль для всех связанных игроков DefaultPosition, или NHibernate позаботится об этом за меня?
Почему NHibernate выполняет только DELETE FROM Positions WHERE Id... и не обновляет поле DefaultPOSition соответствующих игроков? Я пытался добавить Cascade.Delete в HasMany в PositionMap, но это ничего не меняет. Должен ли я запускать собственный запрос, который делает это?
заранее спасибо