我想先禁用带有实体框架代码的链接表的级联删除.例如,如果许多用户有许多角色,而我试图删除一个角色,我希望阻止该删除,因为当前没有与该角色关联的用户.我已经在我的OnModelCreating页中删除了级联删除约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    ...
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

然后我设置了用户角色链接表:

modelBuilder.Entity<User>()
    .HasMany(usr => usr.Roles)
    .WithMany(role => role.Users)
    .Map(m => {
        m.ToTable("UsersRoles");
        m.MapLeftKey("UserId");
        m.MapRightKey("RoleId");
    });

然而,当EF创建数据库时,它会为外键关系创建一个删除级联,例如.

ALTER TABLE [dbo].[UsersRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.UsersRoles_dbo.User_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[User] ([UserId])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[UsersRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.UsersRoles_dbo.Role_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Role] ([RoleId])
ON DELETE CASCADE
GO

如何停止EF生成此删除级联?

推荐答案

我得到了答案.:-)这些级联删除是因为ManyToManyCascadeDeleteConvention次.您需要删除此约定,以防止它为链接表创建级联删除:

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

.net相关问答推荐

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

如何正确使用await using语法?

如何将 Assembly.CodeBase 转换为 C# 中的文件系统路径?

什么是提升运算符?

为什么 .Contains 慢?通过主键获取多个实体的最有效方法?

SqlDateTime.MinValue != DateTime.MinValue,为什么?

Int32.ToString() 是特定于文化的吗?

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

.NET 世界是否有 Maven 替代方案或端口?

如何创建只读依赖属性?

C# 中基于接口编程的运算符重载

为什么 Interlocked.Exchange 不支持布尔类型?

操作对事务的状态无效错误和事务范围

为什么 .NET 中不需要 Maven?

从 Windows 窗体打开 URL

ConcurrentDictionary TryRemove 何时返回 false

使用+运算符的字符串连接

从流中获取 TextReader?

在 C#/.NET 中合并两个图像