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个或多个角色
- 多对多关系是用户和角色之间的关系
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回答问题)