首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架代码:从多到多(>=3)

实体框架代码:从多到多(>=3)
EN

Stack Overflow用户
提问于 2013-11-25 21:35:49
回答 3查看 225关注 0票数 0

我试图通过引入第四个表来建立三个表之间的关系,就像在SQL中一样,但是当我运行'update-database‘时会出现错误:'FK . dbo.ProjectUsersRoles用户Id导致循环或多个级联路径’。我试过属性和流利的Api,但结果是相同的错误。也许有人也犯过类似的错误或问题。以下是代码:

代码语言:javascript
复制
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; }
}

非常感谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-27 11:23:15

只是往另一个方向走

代码语言:javascript
复制
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问题)。

票数 0
EN

Stack Overflow用户

发布于 2013-11-26 15:13:25

您是否尝试指定cascadeOnDelete属性?您必须使用流畅的配置来完成这一任务,比如:

代码语言:javascript
复制
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***

我还没有测试这一点,但如果您希望在删除项目时进行级联删除,我相信这将是配置。但是,您可以考虑手动处理级联删除。

代码语言:javascript
复制
   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);

    }
票数 1
EN

Stack Overflow用户

发布于 2013-11-27 12:10:30

对不起,我误解了你的删除方向。

我只想提醒你一句。请注意,现在执行删除可能会在数据库中留下不可用的数据。示例:如果用户需要RolesOnProjects列表中的项才能在应用程序中使用。删除一个级联删除用户所需的ProjectUserRole的角色,将使用户无效(因为RolesOnProjectList现在是空的)。这可能不是你的问题,但请记住。

(我还不能添加评论(没有50名代表),所以我会在这里回答。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20203836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档