我在两个类之间有一个多对多的关系:锦标赛和玩家
我在映射中设置了Cascade.SaveUpdate,但是在保存锦标赛实例时,球员不会被保存到Players表中。Nhibernate只在链接表中写入父键列和子键列。数据库为SQLite。
这些是映射
public TournamentMap()
{
WithTable("Tournaments");
Id(x => x.Name);
Map(x => x.Start).Access.AsLowerCaseField();
Map(x => x.End).Access.AsLowerCaseField();
HasManyToMany<Player>(x => x.Players)
.WithTableName("TournamentsPlayers")
.WithParentKeyColumn("tournamentName")
.WithChildKeyColumn("playerName").AsSet()
.Access.AsLowerCaseField()
.Cascade.SaveUpdate().LazyLoad();
References(x => x.Type).Access.AsLowerCaseField()
.TheColumnNameIs("typeName")
.Cascade.SaveUpdate();
}
public class PlayerMap : ClassMap<Player>
{
public PlayerMap()
{
WithTable("Players");
Id(x => x.Name);
HasManyToMany<Player>(x => x.Tournaments)
.Access.AsLowerCaseField()
.WithTableName("TournamentsPlayers")
.WithParentKeyColumn("playerName")
.WithChildKeyColumn("tournamentName").AsSet()
.Cascade.SaveUpdate().IsInverse().LazyLoad();
}
}发布于 2009-04-24 03:44:48
可能有一点(或很多)晚了,但尽管如此,
我将您的示例简化为如下所示:
public class Tournament
{
public virtual Guid Id { get; private set; }
private readonly ISet<Player> players;
public Tournament()
{
players = new HashedSet<Player>();
}
public virtual ISet<Player> Players
{
get { return players; }
}
public virtual void AddPlayer(Player player)
{
players.Add(player);
}
}
public class Player
{
public virtual Guid Id { get; private set; }
private readonly ISet<Tournament> tournaments;
public Player()
{
tournaments = new HashedSet<Tournament>();
}
public virtual ISet<Tournament> Tournaments
{
get { return tournaments; }
}
public virtual void AddTournament(Tournament tournament)
{
tournaments.Add(tournament);
}
}
public class TournamentMap : ClassMap<Tournament>
{
public TournamentMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
HasManyToMany<Player>(x => x.Players)
.AsSet().Access.AsLowerCaseField()
.Cascade.SaveUpdate();
}
}
public class PlayerMap : ClassMap<Player>
{
public PlayerMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
HasManyToMany<Tournament>(x => x.Tournaments)
.Access.AsLowerCaseField()
.AsSet()
.Cascade.SaveUpdate().Inverse();
}
}第一个测试如下所示:
[Test]
public void CanSavePlayerAttachedToTournament()
{
Player player = new Player();
Tournament tournament = new Tournament();
player.AddTournament(tournament);
tournament.AddPlayer(player);
Session.Save(tournament);
Session.Flush();
}并生成以下sql:
NHibernate:插入“锦标赛”(Id)值( @p0 );@p0 = '65559bba-8603-4874-8a8f-9bf4018596df‘NHibernate:插入"Player“(Id)值( @p0 );@p0= '549e107c-1339-4fab-8960-9bf4018596e8’NHibernate:插入PlayerToTournament (Tournament_id,Player_id)值(@p0,@p1);@p0= '65559bba-8603-4874-8a8f-9bf4018596df',@p1 =‘549e107c-1339-4fab-8960-9bf1840596e8’
第二个测试如下所示:
[Test]
public void CanSaveTounamentAttachedToPlayer()
{
Player player = new Player();
Tournament tournament = new Tournament();
player.AddTournament(tournament);
tournament.AddPlayer(player);
Session.Save(player);
Session.Flush();
}并生成以下sql:
NHibernate:插入"Player“(Id)值( @p0 );@p0 = '35c078c5-1102-4c63-91ca-9bf40185971c‘NHibernate:插入”锦标赛“(Id)值( @p0 );@p0= '367898cf-5835-4e1b-9d7d-9bf40185971c’NHibernate:插入PlayerToTournament (Tournament_id,Player_id)值(@p0,@p1);@p0= '367898cf-5835-4e1b-9d7d-9bf40185971c',@p1 = '35c078c5-1102-4c63-91ca-9bf40185971c‘’
发布于 2009-10-22 14:36:54
总是在事务中保存。
干杯
https://stackoverflow.com/questions/431509
复制相似问题