Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core 1.1多对多关系(删除无操作或更新无操作时)_C#_.net_Entity Framework Core - Fatal编程技术网

C# EF Core 1.1多对多关系(删除无操作或更新无操作时)

C# EF Core 1.1多对多关系(删除无操作或更新无操作时),c#,.net,entity-framework-core,C#,.net,Entity Framework Core,我正在尝试创建一个具有多对多关系的模型: 公司可以有0个或更多用户 公司可以有0个或多个角色 多对多关系是用户和角色之间的关系 每次尝试创建数据库(更新数据库)时,我都会收到以下消息: 在表“UsersRoles”上引入外键约束“FK\u UsersRoles\u UserId”可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。 我不明白它指的是什么循环。我的意思是,如果我删除了一个用户,它必须删除UsersRoles中的实体,而不是别的。如果我删除一个角

我正在尝试创建一个具有多对多关系的模型:

  • 公司可以有0个或更多用户

  • 公司可以有0个或多个角色

  • 多对多关系是用户和角色之间的关系

每次尝试创建数据库(更新数据库)时,我都会收到以下消息:

在表“UsersRoles”上引入外键约束“FK\u UsersRoles\u UserId”可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。

我不明白它指的是什么循环。我的意思是,如果我删除了一个用户,它必须删除UsersRoles中的实体,而不是别的。如果我删除一个角色,情况也一样

如果我的模型只有用户和角色,没有公司表,则会创建数据库

我做错了什么

public class MyContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server = (localdb)\\mssqllocaldb; Database = ConsoleApp1; Trusted_Connection = True; MultipleActiveResultSets = true");

        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserRole>()
            .ToTable("UsersRoles")
            .HasKey(t => new { t.UserId, t.RoleId });

        modelBuilder.Entity<UserRole>()
            .HasOne(pt => pt.User)
            .WithMany(p => p.UsersRoles)
            .HasForeignKey(pt => pt.UserId);

        modelBuilder.Entity<UserRole>()
            .HasOne(pt => pt.Role)
            .WithMany(t => t.UsersRoles)
            .HasForeignKey(pt => pt.RoleId);

        base.OnModelCreating(modelBuilder);
    }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<User> Users { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Surname { get; set; }
    public int CompanyId { get; set; }
    public Company Company { get; set; }
    public ICollection<UserRole> UsersRoles { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CompanyId { get; set; }
    public Company Company { get; set; }
    public ICollection<UserRole> UsersRoles { get; set; }
}

public class UserRole
{
    public int UserId { get; set; }
    public User User { get; set; }
    public int RoleId { get; set; }
    public Role Role { get; set; }
}
公共类MyContext:DbContext
{
公共数据库集公司{get;set;}
公共数据库集用户{get;set;}
公共数据库集角色{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
optionsBuilder.UseSqlServer(“服务器=(localdb)\\mssqllocaldb;数据库=控制台EAPP1;受信任的连接=真;MultipleActiveResultSets=真”);
基本配置(选项生成器);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.ToTable(“用户角色”)
.HasKey(t=>new{t.UserId,t.RoleId});
modelBuilder.Entity()
.HasOne(pt=>pt.User)
.WithMany(p=>p.UsersRoles)
.HasForeignKey(pt=>pt.UserId);
modelBuilder.Entity()
.HasOne(pt=>pt.Role)
.WithMany(t=>t.UsersRoles)
.HasForeignKey(pt=>pt.RoleId);
基于模型创建(modelBuilder);
}
}
公营公司
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection用户{get;set;}
公共ICollection角色{get;set;}
}
公共类用户
{
公共int Id{get;set;}
公共字符串姓氏{get;set;}
public int CompanyId{get;set;}
上市公司{get;set;}
公共ICollection用户角色{get;set;}
}
公共阶级角色
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public int CompanyId{get;set;}
上市公司{get;set;}
公共ICollection用户角色{get;set;}
}
公共类用户角色
{
public int UserId{get;set;}
公共用户{get;set;}
public int RoleId{get;set;}
公共角色{get;set;}
}

删除公司的周期。它必须级联删除相关的用户和角色,这反过来又必须删除
UserRole
记录。因此,可以通过
User
Role
删除一个相同的
UserRole
。由于SqlServer数据库不支持这种关系,EF(Core)也不支持这种关系(尽管其他RDBMS,如Oracle,在这种关系上没有问题)。因此,一种解决方案是在OnModelCreating中禁用公司的级联删除,并在删除公司时手动删除用户和角色<代码>modelBuilder.Entity()。HasMany(h=>h.Users)。WithOne(w=>w.Company).OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);modelBuilder.Entity()。有许多(h=>h.Roles)。WithOne(w=>w.Company).OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict)正确。尽管对于导致循环的一个实体,关闭级联删除应该足够了。例如,
公司
->
用户
,在删除公司之前只删除相关的
用户
。@Manfrons,这篇文章和评论帮助我理解了dbcontext配置的问题。我建议您总结评论中的信息,并发布一个自我回答(如果您这样做,请ping我,我将+1回答问题)