首页 > 解决方案 > 如何从 Dotnet EF 中删除唯一索引?

问题描述

我有一个模型:

用户

public class User {
 public int Id { get; set; }
 public string UserName {get; set;}
 ...
 public int? ManagerId {get; set;}
 public User Manager {get; set;}
 public int? SupervisorId {get; set;}
 public User Supervisor {get; set;}
..
}

我检查了我的 MySQL Db,发现 ManagerId 是唯一的。我没有将其设置为唯一。现在我想使用 dotnet ef 迁移来删除它。怎么做 ?

我目前使用 donet core 2.1。

我已经删除 ManagerID 和 Manager 进行测试,并执行 dotnet ef migrations add UpdateUser

检查并删除 ManagerID。然后我尝试再次添加新名称AssignedManagerID,它创建了一个唯一为真的新名称。

migrationBuilder.CreateIndex(
                name: "IX_Users_AssignedManagerId",
                table: "Users",
                column: "AssignedManagerId",
                unique: true);

我的数据上下文:公共 DbSet 用户 {get; 放;}

我对用户的 OnModelCreating() 一点也不流利

标签: c#asp.net.netentity-framework-coreef-core-2.1

解决方案


EF Core 对两个自引用User导航属性感到困惑,并错误地认为您正在尝试对 和 之间的一对一关系进行User.Manager建模User.Supervisor。它(随机)选择Suprevisor作为主体并通过创建唯一的 FK 关系ManagerIdSuprevisorId不被视为 FK,因此不会为其创建 FK 关系。

像往常一样,当 EF Core 假设不正确时,您应该使用数据注释和/或流式 API 显式解决它们。对于自引用关系,唯一的选择是 fluent API,因此将以下内容添加到您的OnModelCreating覆盖中以创建两个一对多关系:

modelBuilder.Entity<User>().HasOne(e => e.Manager).WithMany();
modelBuilder.Entity<User>().HasOne(e => e.Supervisor).WithMany();

推荐阅读