我试图通过引入第四个表来建立三个表之间的关系,就像在SQL中一样,但是当我运行'update-database‘时会出现错误:'FK . dbo.ProjectUsersRoles用户Id导致循环或多个级联路径’。我试过属性和流利的Api,但结果是相同的错误。也许有人也犯过类似的错误或问题。以下是代码:
public class Project
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<ProjectUserRole> UsersRoles { get; set; }
}
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<ProjectUserRole> RolesOnProject { get; set; }
}
public class Role
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<ProjectUserRole> UsersProjects { get; set; }
}
public class ProjectUserRole
{
[Key]
public int UserId { get; set; }
[Key]
public int ProjectId { get; set; }
[Key]
public int RoleId { get; set; }
public User User { get; set; }
public Project Project { get; set; }
public Role Role { get; set; }
}非常感谢你的帮助!
发布于 2013-11-27 11:23:15
只是往另一个方向走
modelBuilder.Entity<ProjectUserRole>()
.HasRequired(x => x.Project)
.WithMany(x => x.UsersRoles)
.HasForeignKey(x => x.ProjectId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<ProjectUserRole>()
.HasRequired(x => x.User)
.WithMany(x => x.RolesOnProjects)
.HasForeignKey(x => x.UserId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<ProjectUserRole>()
.HasRequired(x => x.Role)
.WithMany(x => x.ProjectsUsers)
.HasForeignKey(x => x.RoleId)
.WillCascadeOnDelete(true);希望这对某人有帮助。WillDeleteOnCascade指向linking表
问题还可能出现在级联链中的多个相同的表中(该表可能只在级联链中出现一次--这不是codefirst问题,而是MSSQL问题)。
发布于 2013-11-26 15:13:25
您是否尝试指定cascadeOnDelete属性?您必须使用流畅的配置来完成这一任务,比如:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.RolesOnProject).WithRequired()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Project>()
.HasMany(u => u.UsersRoles).WithRequired()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Role>()
.HasMany(u => u.UsersProjects).WithRequired()
.WillCascadeOnDelete(false);
}此方法应该在您的DbContext类中。正如您所看到的,我将所有这些设置为在delete上不级联。你得摆弄这个让它做你想做的事。
-------***EDIT***
我还没有测试这一点,但如果您希望在删除项目时进行级联删除,我相信这将是配置。但是,您可以考虑手动处理级联删除。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.RolesOnProject).WithRequired()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Project>()
.HasMany(u => u.UsersRoles).WithRequired()
.WillCascadeOnDelete(true); // Changed this..
modelBuilder.Entity<Role>()
.HasMany(u => u.UsersProjects).WithRequired()
.WillCascadeOnDelete(false);
}发布于 2013-11-27 12:10:30
对不起,我误解了你的删除方向。
我只想提醒你一句。请注意,现在执行删除可能会在数据库中留下不可用的数据。示例:如果用户需要RolesOnProjects列表中的项才能在应用程序中使用。删除一个级联删除用户所需的ProjectUserRole的角色,将使用户无效(因为RolesOnProjectList现在是空的)。这可能不是你的问题,但请记住。
(我还不能添加评论(没有50名代表),所以我会在这里回答。
https://stackoverflow.com/questions/20203836
复制相似问题