entity-framework - Entity Framework 核心 : How to solve Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths

标签 entity-framework foreign-keys entity-framework-core

我将 Entity Framework Core 与 Code First 方法一起使用,但在更新数据库时收到以下错误:

Introducing FOREIGN KEY constraint 'FK_AnEventUsers_Users_UserId' on table 'AnEventUsers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.



我的实体是这些:
public class AnEvent
{
    public int AnEventId { get; set; }
    public DateTime Time { get; set; }
    public Gender Gender { get; set; }
    public int Duration { get; set; }
    public Category Category { get; set; }
    public int MinParticipants { get; set; }
    public int MaxParticipants { get; set; }
    public string Description { get; set; }
    public Status EventStatus { get; set; }
    public int MinAge { get; set; }
    public int MaxAge { get; set; }
    public double Longitude { get; set; }
    public double Latitude { get; set; }

    public ICollection<AnEventUser> AnEventUsers { get; set; }

    public int UserId { get; set; }
    public User User { get; set; }
}


public class User
{
    public int UserId { get; set; }
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Gender Gender { get; set; }
    public double Rating { get; set; }

    public ICollection<AnEventUser> AnEventUsers { get; set; }
}

public class AnEventUser
{
    public int AnEventId { get; set; }
    public AnEvent AnEvent { get; set; }

    public int UserId { get; set; }
    public User User { get; set; }

}

public class ApplicationDbContext:DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options):base(options)
    { }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AnEventUser>()
            .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict);


        modelBuilder.Entity<AnEventUser>()
            .HasKey(t => new { t.AnEventId, t.UserId });

        modelBuilder.Entity<AnEventUser>()
            .HasOne(pt => pt.AnEvent)
            .WithMany(p => p.AnEventUsers)
            .HasForeignKey(pt => pt.AnEventId);

        modelBuilder.Entity<AnEventUser>()
            .HasOne(eu => eu.User)
            .WithMany(e => e.AnEventUsers)
            .HasForeignKey(eu => eu.UserId);

    }

    public DbSet<AnEvent> Events { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<AnEventUser> AnEventUsers { get; set; }
}

我认为的问题是,如果我们删除 User,则对 AnEvent 的引用将被删除,对 AnEventUser 的引用也将被删除,因为 AnEvent 中也有对 AnEventUser 的引用,我们会得到级联路径。但是我删除了从 User 到 AnEventUser 的删除级联:
 modelBuilder.Entity<AnEventUser>()
        .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict);

但是错误没有得到解决,有人看到出了什么问题吗?谢谢!

最佳答案

在您的示例代码中 OnModelCreating您已申报 modelBuilder.Entity<AnEventUser>().HasOne(e => e.User)...两次:在方法开始和结束时。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AnEventUser>()       // THIS IS FIRST
        .HasOne(u => u.User).WithMany(u => u.AnEventUsers).IsRequired().OnDelete(DeleteBehavior.Restrict);


    modelBuilder.Entity<AnEventUser>()
        .HasKey(t => new { t.AnEventId, t.UserId });

    modelBuilder.Entity<AnEventUser>()
        .HasOne(pt => pt.AnEvent)
        .WithMany(p => p.AnEventUsers)
        .HasForeignKey(pt => pt.AnEventId);

    modelBuilder.Entity<AnEventUser>()       // THIS IS SECOND.
        .HasOne(eu => eu.User)               // THIS LINES
        .WithMany(e => e.AnEventUsers)       //   SHOULD BE
        .HasForeignKey(eu => eu.UserId);     //   REMOVED

}

第二个调用首先覆盖。去掉它。

关于entity-framework - Entity Framework 核心 : How to solve Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750960/

相关文章:

entity-framework - EF 4.1 RC EF CF 中的多对多关系

c# - 不要在 "using"语句后处理属性

c# - Entity Framework 6 : detect relationship changes

entity-framework - 使用 EF Core 3.1 将 SQL 查询挂载到 EXTRACT postgresql 函数

c# - FormatException : The string was not recognized as a valid DateTime. 有一个从索引 0 开始的未知单词

c# - 在 SQL Server 中使用 GUID 的性能影响

mysql - 对具有外键的 mySQL 表进行分区?

mysql - 如何在 MySQL 中进行行版本控制,同时保持外键引用完整性

asp.net-core - 在微服务架构中是否有正确使用 EF + DDD 的方法?

c# - 在一个 DBContext 中处理多个模式