c# - 如何从 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() 一点也不流利
解决方案
EF Core 对两个自引用User
导航属性感到困惑,并错误地认为您正在尝试对 和 之间的一对一关系进行User.Manager
建模User.Supervisor
。它(随机)选择Suprevisor
作为主体并通过创建唯一的 FK 关系ManagerId
。SuprevisorId
不被视为 FK,因此不会为其创建 FK 关系。
像往常一样,当 EF Core 假设不正确时,您应该使用数据注释和/或流式 API 显式解决它们。对于自引用关系,唯一的选择是 fluent API,因此将以下内容添加到您的OnModelCreating
覆盖中以创建两个一对多关系:
modelBuilder.Entity<User>().HasOne(e => e.Manager).WithMany();
modelBuilder.Entity<User>().HasOne(e => e.Supervisor).WithMany();
推荐阅读
- c - 在 C 中使用链表的基本队列实现导致意外输出
- postgresql - 错误连接到 PostgreSQL 无法腌制 psycopg2.extensions.connection 对象
- typescript - TypeScript 中的一些语法糖,用于值与类型偶数的情况?
- css - 在 css 中仅选择顶级 UL
- powershell - 如何使用 PowerShell 按名称过滤具有不同扩展名文件的文件?
- assembly - 使用相同的寄存器执行 ADD 和 SW 时 MIPS 中的数据危险?
- php - 运行单个 foreach 以获取两组值
- algorithm - 使用实际阶跃函数生成理想阶跃函数
- java - IntelliJ 抱怨我使用的是 Java 5,但实际上它是 Java 12
- html - 删除不需要的水平滚动(水平滚动来自哪里?)