定义多对多关系的代码优先方法导致有关 "cycles or multiple cascade paths" 的 mssql 错误
Code first approach to defining a many-to-many relationship results in the mssql error about "cycles or multiple cascade paths"
我正在尝试使用 Code First 方法在我的数据库中创建一些表,我在那里也需要多对多关系。
这是我的实体的定义:
public class User
{
...
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class Course
{
...
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class UserCourse
{
public int UserId { get; set; }
public User User { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
然后我不得不告诉 EF Core 我希望它是 M-M 关系:
// set many-to-many relationship between user and course
modelBuilder.Entity<UserCourse>()
.HasKey(uc => new {uc.UserId, uc.CourseId});
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.User)
.WithMany(u => u.UserCourses)
.HasForeignKey(uc => uc.UserId);
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.Course)
.WithMany(c => c.UserCourses)
.HasForeignKey(uc => uc.CourseId);
我没有为我的实体指定 DeleteBehavior,所以 SQL 服务器给我错误:
Introducing FOREIGN KEY constraint 'FK_UsersCourses_Users_UserId' on table 'UsersCourses' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
所以我寻找了一些解决方案,发现我必须指定 DeleteBehaviour。我是这样做的:
// set ondelete to be restrict
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.User)
.WithMany(u => u.UserCourses)
.Metadata.DeleteBehavior = DeleteBehavior.Restrict;
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.Course)
.WithMany(c => c.UserCourses)
.Metadata.DeleteBehavior = DeleteBehavior.Restrict;
尽管SQL 服务器要求我将OnDelete 更改为NO ACTION,但DeleteBehavior 枚举中没有NO ACTION。相反,它在 ReferentialAction 枚举中,这是一个用于迁移的枚举,所以我不能手动触摸它(我的意思是这似乎是一个糟糕的设计决定)。互联网上的人说 Restrict 正是我在这里寻找的。行。嗯,那么问题应该解决了吧?很遗憾,绝对不是。
SQL 服务器仍然给我同样的错误:
Introducing FOREIGN KEY constraint 'FK_UsersCourses_Users_UserId' on table 'UsersCourses' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我完全不知道该怎么办。我几乎尝试了所有方法,尽管我在 EF Core 代码优先方法方面经验不足。
我的问题很简单:我该如何解决?
删除所有迁移并初始化新的(第一个)迁移对我很有帮助。
为此,请执行以下步骤:
- 从您的项目中删除 Migrations 文件夹。
- 从数据库中删除 __EFMigrationsHistory table(删除 table __EFMigrationsHistory)
- 在程序包管理器控制台中键入以下内容:"Add-Migration Initial"
- 在程序包管理器控制台中键入以下内容:"update-database"
我正在尝试使用 Code First 方法在我的数据库中创建一些表,我在那里也需要多对多关系。
这是我的实体的定义:
public class User
{
...
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class Course
{
...
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class UserCourse
{
public int UserId { get; set; }
public User User { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
然后我不得不告诉 EF Core 我希望它是 M-M 关系:
// set many-to-many relationship between user and course
modelBuilder.Entity<UserCourse>()
.HasKey(uc => new {uc.UserId, uc.CourseId});
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.User)
.WithMany(u => u.UserCourses)
.HasForeignKey(uc => uc.UserId);
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.Course)
.WithMany(c => c.UserCourses)
.HasForeignKey(uc => uc.CourseId);
我没有为我的实体指定 DeleteBehavior,所以 SQL 服务器给我错误:
Introducing FOREIGN KEY constraint 'FK_UsersCourses_Users_UserId' on table 'UsersCourses' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
所以我寻找了一些解决方案,发现我必须指定 DeleteBehaviour。我是这样做的:
// set ondelete to be restrict
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.User)
.WithMany(u => u.UserCourses)
.Metadata.DeleteBehavior = DeleteBehavior.Restrict;
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.Course)
.WithMany(c => c.UserCourses)
.Metadata.DeleteBehavior = DeleteBehavior.Restrict;
尽管SQL 服务器要求我将OnDelete 更改为NO ACTION,但DeleteBehavior 枚举中没有NO ACTION。相反,它在 ReferentialAction 枚举中,这是一个用于迁移的枚举,所以我不能手动触摸它(我的意思是这似乎是一个糟糕的设计决定)。互联网上的人说 Restrict 正是我在这里寻找的。行。嗯,那么问题应该解决了吧?很遗憾,绝对不是。
SQL 服务器仍然给我同样的错误:
Introducing FOREIGN KEY constraint 'FK_UsersCourses_Users_UserId' on table 'UsersCourses' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我完全不知道该怎么办。我几乎尝试了所有方法,尽管我在 EF Core 代码优先方法方面经验不足。
我的问题很简单:我该如何解决?
删除所有迁移并初始化新的(第一个)迁移对我很有帮助。
为此,请执行以下步骤:
- 从您的项目中删除 Migrations 文件夹。
- 从数据库中删除 __EFMigrationsHistory table(删除 table __EFMigrationsHistory)
- 在程序包管理器控制台中键入以下内容:"Add-Migration Initial"
- 在程序包管理器控制台中键入以下内容:"update-database"