如何从Dotnet EF中删除唯一索引?

时间:2018-09-12 05:10:05

标签: c# asp.net .net entity-framework-core ef-core-2.1

我有一个模特:

用户

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迁移添加UpdateUser

已选中,并且ManagerID已删除。然后我尝试再次添加新名称AssignedManagerID,并创建了一个唯一的名称为true的新名称。

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

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

我对用户的OnModelCreating()完全没有流利

2 个答案:

答案 0 :(得分:1)

EF Core被两个自引用的User导航属性所迷惑,并且错误地决定您试图对User.ManagerUser.Supervisor之间的一对一关系进行建模。它(随机)选择Suprevisor作为主体,并通过ManagerId创建唯一的FK关系。 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();

答案 1 :(得分:0)

您可以尝试以下代码。

migrationBuilder.DropIndex(name:"IX_Users_AssignedManagerId",table:"Users");

它在我的项目中起作用。谢谢