gpt4 book ai didi

VS2012 Entity Framework 5(EF5 - 最终版本)中与 'code first' 的多对多关系

转载 作者:行者123 更新时间:2023-12-04 03:57:43 24 4
gpt4 key购买 nike

有一天,我现在投资寻找解决方案,但没有成功。

我喜欢创建一个简单的多对多关系。

为此我创建了两个模型:

一个 Player 类,我将在其中使用“Turnaments”导航属性来查看哪个 turnaments 访问了玩家。

public class Player
{
[Key]
public Int64 PlayerId { get; set; }

public string FirstName { get; set; }

[Required]
public string Surename { get; set; }

public virtual ICollection<Turnament> Turnaments { get; set; }
}

还有一个 Turnament 类,我将在其中使用“玩家”导航属性来查看哪些玩家参与了比赛。

public class Turnament
{
[Key]
public int TurnamentId { get; set; }

[Required]
public string Name { get; set; }

public DateTime? StartDate { get; set; }

public DateTime? EndDate { get; set; }

public bool IsClosed { get; set; }

public virtual ICollection<Player> Players { get; set; }
}

如果在 VS2012 的“Package Manager Console”窗口中通过命令“upate-database”(automtic migratons = on)开始迁移 - 我得到以下异常:

在表“PlayerTurnaments”上引入外键约束“FK_dbo.PlayerTurnaments_dbo.Turnaments_Turnament_TurnamentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。查看以前的错误。

还有我了解的那个异常的背景。

所以我会告诉 Entity Framework 如果我要删除:

a) Player EF 不应将级联删除推送到关联的 Turnament

b) Turnament EF 应该将级联删除推送给关联的 Player

有了那个背景,循环路径就消失了。

所以我尝试通过 Entity Framwork 的 fluent-API 实现“关闭级联删除开关”:

public class DataContext : DbContext
{
public DbSet<Turnament> Turnaments { get; set; }
public DbSet<Player> Players { get; set; }

protected override void OnModelCreating( DbModelBuilder modelBuilder )
{

//modelBuilder.Entity<Turnament>()
// .HasMany( b => b.Players )
// .WithMany( a => a.Turnaments )
// .Map( m => m.MapLeftKey( "PlayerPid" )
// .MapRightKey( "TurnamentPid" )
// .ToTable( "TurnamentsJoinPlayers" ) );


//modelBuilder.Entity<Player>().HasRequired( t => t.Turnaments ).
// WithMany().WillCascadeOnDelete( false );

//modelBuilder.Entity<Turnament>().HasRequired( t => t.Players ).
// WithMany().WillCascadeOnDelete( false );

//modelBuilder.Entity<Player>().HasRequired( t => t.TurnamentsRelation ).
// WithMany().HasForeignKey( p => p.PlayerId ).WillCascadeOnDelete( false );

//modelBuilder.Entity<Player>().HasMany(p => p.TurnamentsRelation).

base.OnModelCreating( modelBuilder );

}
}

但如您所见,一切都值得称赞,因为它无济于事。

感谢所有有能力的帮助,因为只有一些只有破解才能理解的代码片段:)PS:我确定对于这种多对多关系的 EF5(最终)有一个解决方案

最佳答案

解决方案

public class MyAppContext : DbContext
{

public MyAppContext()
{
// Somtimes helps to uncommend that line, then the Database will recreated!
// (For people that are not fit enough in EF CodeFirst - like me ;)
// 1) Uncommend
// 2) Start Application go on a site that access your data wait for
// Exception (No Database!)
// 3) Unkommend line
// 4) Execute 'update-database' at the 'Package Manager Console' of VS 2012
// Database.SetInitializer(new DropCreateDatabaseAlways<LivescoreContext>());
}

protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
/* Players <-> Turnaments */
modelBuilder.Entity<Player>()
.HasMany( p => p.Turnaments )
.WithMany( p => p.Players )
.Map( mc =>
{
mc.MapLeftKey( "PlayerPid" );
mc.MapRightKey( "TurnamentPid" );
mc.ToTable( "PlayersJoinTurnaments" );
} );

base.OnModelCreating( modelBuilder );
}
}

关于VS2012 Entity Framework 5(EF5 - 最终版本)中与 'code first' 的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com