Hello everybody,
I hope this post won't be too long, and I'll be able to correctly
explain this problem which makes me go nuts.
I have an entity hierarchy with teams, which have TeamRosters,
containing a reference to Players (with further informations).
I have some Matches, which each one having a reference to the both
teams competing, and a reference to MatchRosters (one for each team),
containing the players from each team, who will play the match.
TeamRoster and MatchRoster both derive from an abstract Roster entity.
I have the following test:
[Fact]
public void DeleteEntity_DoesntDeleteTeam_IfTeamHasMatches()
{
var player = new Player("M", "D", 10, Sex.Male);
Kernel.Get<IPlayersRepository>().Save(player);
var team = new Team("JAO", Sex.Male);
team.DefaultRoster.AddPlayer(player);
Kernel.Get<ITeamsRepository>().Save(team);
var otherTeam = new Team("USVO", Sex.Male);
Kernel.Get<ITeamsRepository>().Save(otherTeam);
var match = new Match()
{
Name = "Foo",
Location = "Bar",
HomeTeam = team,
RoadTeam = otherTeam
};
Kernel.Get<IMatchesRepository>().Save(match);
var viewModel = Kernel.Get<TeamsManagementViewModel>();
viewModel.DisplayEntity(new DisplayEntityInfosMessage(1));
var dbQuery =
viewModel.DeleteEntity().Enumerate().Next<DbQueryResult>();
dbQuery.DoQuery();
Assert.Equal(2,
Kernel.Get<ISession>().QueryOver<Team>().RowCount());
}
Here are the SQL commands before I create viewModel:
NHibernate: INSERT INTO Players (Sex, FirstName, LastName,
DefaultNumber, Visible, DefaultPosition_id, Id) VALUES (@p0, @p1, @p2,
@p3, @p4, @p5, @p6);@p0 = 0 [Type: Int32 (0)], @p1 = 'M' [Type: String
(0)], @p2 = 'D' [Type: String (0)], @p3 = 10 [Type: Int32 (0)], @p4 =
True [Type: Boolean (0)], @p5 = NULL [Type: Int32 (0)], @p6 = 1 [Type:
Int32 (0)]
NHibernate: INSERT INTO Teams (Sex, Name, Visible, Location, Id)
VALUES (@p0, @p1, @p2, @p3, @p4);@p0 = 0 [Type: Int32 (0)], @p1 =
'JAO' [Type: String (0)], @p2 = True [Type: Boolean (0)], @p3 = NULL
[Type: String (0)], @p4 = 1 [Type: Int32 (0)]
NHibernate: INSERT INTO "Roster" (Team_id, Id) VALUES (@p0, @p1);@p0 =
1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
NHibernate: INSERT INTO "TeamRoster" (IsDefault, Name, Team_id,
Roster_id) VALUES (@p0, @p1, @p2, @p3);@p0 = True [Type: Boolean (0)],
@p1 = 'Default' [Type: String (0)], @p2 = 1 [Type: Int32 (0)], @p3 = 1
[Type: Int32 (0)]
NHibernate: INSERT INTO "PlayerInTeam" (PlayerNumber, Player_id,
Position_id, Roster_id, Id) VALUES (@p0, @p1, @p2, @p3, @p4);@p0 = 10
[Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)], @p2 = NULL [Type: Int32
(0)], @p3 = 1 [Type: Int32 (0)], @p4 = 1 [Type: Int32 (0)]
NHibernate: INSERT INTO Teams (Sex, Name, Visible, Location, Id)
VALUES (@p0, @p1, @p2, @p3, @p4);@p0 = 0 [Type: Int32 (0)], @p1 =
'USVO' [Type: String (0)], @p2 = True [Type: Boolean (0)], @p3 = NULL
[Type: String (0)], @p4 = 2 [Type: Int32 (0)]
NHibernate: INSERT INTO "Roster" (Team_id, Id) VALUES (@p0, @p1);@p0 =
2 [Type: Int32 (0)], @p1 = 2 [Type: Int32 (0)]
NHibernate: INSERT INTO "TeamRoster" (IsDefault, Name, Team_id,
Roster_id) VALUES (@p0, @p1, @p2, @p3);@p0 = True [Type: Boolean (0)],
@p1 = 'Default' [Type: String (0)], @p2 = 2 [Type: Int32 (0)], @p3 = 2
[Type: Int32 (0)]
NHibernate: INSERT INTO "Roster" (Team_id, Id) VALUES (@p0, @p1);@p0 =
1 [Type: Int32 (0)], @p1 = 3 [Type: Int32 (0)]
NHibernate: INSERT INTO "MatchRoster" (Match_id, Roster_id) VALUES
(@p0, @p1);@p0 = NULL [Type: Int32 (0)], @p1 = 3 [Type: Int32 (0)]
NHibernate: INSERT INTO "PlayerInTeam" (PlayerNumber, Player_id,
Position_id, Roster_id, Id) VALUES (@p0, @p1, @p2, @p3, @p4);@p0 = 10
[Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)], @p2 = NULL [Type: Int32
(0)], @p3 = 3 [Type: Int32 (0)], @p4 = 2 [Type: Int32 (0)]
NHibernate: INSERT INTO "Roster" (Team_id, Id) VALUES (@p0, @p1);@p0 =
2 [Type: Int32 (0)], @p1 = 4 [Type: Int32 (0)]
NHibernate: INSERT INTO "MatchRoster" (Match_id, Roster_id) VALUES
(@p0, @p1);@p0 = NULL [Type: Int32 (0)], @p1 = 4 [Type: Int32 (0)]
NHibernate: INSERT INTO Matches (Name, Date, Location,
Championship_id, HomeTeam_id, RoadTeam_id, HomeRoster_id,
RoadRoster_id, Id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7,
@p8);@p0 = 'Foo' [Type: String (0)], @p1 = 4/11/2010 12:56:00 [Type:
DateTime (0)], @p2 = 'Bar' [Type: String (0)], @p3 = NULL [Type: Int32
(0)], @p4 = 1 [Type: Int32 (0)], @p5 = 2 [Type: Int32 (0)], @p6 = 3
[Type: Int32 (0)], @p7 = 4 [Type: Int32 (0)], @p8 = 1 [Type: Int32
(0)]
NHibernate: UPDATE "MatchRoster" SET Match_id = @p0 WHERE Roster_id =
@p1;@p0 = 1 [Type: Int32 (0)], @p1 = 3 [Type: Int32 (0)]
NHibernate: UPDATE "MatchRoster" SET Match_id = @p0 WHERE Roster_id =
@p1;@p0 = 1 [Type: Int32 (0)], @p1 = 4 [Type: Int32 (0)]
The key property here is match.HomeRoster.Players, which, after the
match is saved, has 1 player, as it should.
The problem comes after I create the viewModel:
I ask it to load the team from the database, with DisplayEntity, which
consists in a call to Repository.ReGet:
public TEntity ReGet(int id)
{
return Transact(() =>
{
var entity = Get(id);
Session.Evict(entity);
Session.Load(entity, id);
return entity;
});
}
When I get the entity back in my view-model, there is not only one
player in Match.HomeRoster.Players, but 2, the latter being a
transient player. Which of course throws the following exception:
NHibernate.PropertyValueException: not-null property references a null
or transient value Emidee.CommonEntities.PlayerInTeam.Roster.
Do you have any ideas about why I have this problem?
Thanks in advance
PS: Here are the mappings of the various entities used in this test,
with FluentNH:
public class TeamMap : ClassMap<Team>
{
public TeamMap()
{
Id(t => t.Id)
.GeneratedBy.Increment();
HasMany(t => t.Rosters)
.AsSet()
.Inverse()
.Cascade.AllDeleteOrphan();
HasMany(t => t.MatchesAtHome)
.Inverse();
HasMany(t => t.MatchesOnRoad)
.Inverse();
}
}
public class MatchMap : ClassMap<Match>
{
public MatchMap()
{
Id(p => p.Id)
.GeneratedBy.Increment();
References(m => m.HomeTeam)
.Not.Nullable();
References(m => m.RoadTeam)
.Not.Nullable();
References(m => m.HomeRoster)
.Cascade.SaveUpdate();
References(m => m.RoadRoster)
.Cascade.SaveUpdate();
}
}
public class RosterMap : ClassMap<Roster>
{
public RosterMap()
{
Id(tr => tr.Id)
.GeneratedBy.Increment();
References(tr => tr.Team)
.Not.Nullable();
HasMany(r => r.Players)
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
public class MatchRosterMap : SubclassMap<MatchRoster>
{
public MatchRosterMap()
{
References(mr => mr.Match);
}
}
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.