Entity Framework Core:表“Users”中的列“Id”的类型无法用作索引中的键列

Jeb*_*eng 6 c# entity-framework-core

它在 SQLite 下工作

数据库上下文.cs

public class DbContext : DbContext
{
    public DbContext(DbContextOptions<DbContext> options) : base(options)
    {
    }

    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用户.cs

public class User : OAuthUser
{
    public string FullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

OAuthUser.cs

public class OAuthUser
{
    public string Id { get; set; }

    public string Email { get; set; }

    public string UserName { get; set; }

    public string PhoneNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我执行了Add-MigrationDatabase-Update。它应该更新到我机器上的 SQLServer 但它记录了以下错误:

表“Users”中的列“Id”的类型无法用作索引中的键列。无法创建约束或索引。请参阅以前的错误。

我想要IdinOAuthUser.cs作为主键,但出现错误

Jeb*_*eng 23

更改数据库服务时需要删除所有迁移。

  • 删除了迁移文件夹并且工作得很好 (3认同)

Tan*_*jel 5

由于缺乏StringLength规范而显示错误。如果是string主键,则必须指定长度,因为 sql server 中的主键是唯一索引键。

如果您希望该Id列成为主要string类型,那么您必须StringLength按如下方式放置此列:

public class OAuthUser
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [StringLength(50)]
    public string Id { get; set; }

    ...........
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望Id列成auto-generated为主键,则应如下所示:

public class OAuthUser
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

    ...........
}
Run Code Online (Sandbox Code Playgroud)

您可以选择两者之一。

  • 我不认为这是必要的要求 (2认同)
  • 我有很多项目没有指定字符串密钥的长度。它会自动进行。所以在我看来,其他地方还有问题。我可能会犯错。 (2认同)