【问题标题】:Entity Framework Core: Column 'Id' in table 'Users' is of a type that is invalid for use as a key column in an indexEntity Framework Core:表“Users”中的列“Id”的类型不能用作索引中的键列
【发布时间】:2020-02-08 11:58:20
【问题描述】:

在 SQLite 下工作

DbContext.cs

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

    public DbSet<User> Users { get; set; }
}

用户.cs

public class User : OAuthUser
{
    public string FullName { get; set; }
}

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; }
}

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

表“Users”中的列“Id”属于无效类型,不能用作索引中的键列。 无法创建约束或索引。查看以前的错误。

我希望OAuthUser.cs中的Id作为主键,但是出现错误

【问题讨论】:

  • 键列是 SQL 数据库中的主键。所以类型必须匹配,并且类型需要一个 Hash 方法。普通的 c# 类 line int 或 string 已内置 Hash 方法。您是否在 SQL 数据库中检查了用于密钥的类型?
  • 如果你想让DbSet&lt;User&gt;OrganizationUser 工作,为什么?
  • 现在您的数据库中有User。但是User和你的OrganizationUserOAuthUser有什么关系呢?为什么不给我们看看User的源代码?

标签: c# entity-framework-core


【解决方案1】:

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

【讨论】:

  • 删除了迁移文件夹并完美运行
【解决方案2】:

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

如果您希望Id 列是string 类型的主要列,那么您必须将StringLength 放在此列上,如下所示:

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

    ...........
}

或者如果您希望Id 列是auto-generated 主键,那么它应该如下:

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

    ...........
}

您可以选择两者中的任何一个。

【讨论】:

  • 我不认为这是必要的要求
  • @Anton 该错误显示由于缺少StringLength 规范。如果是字符串主键,则必须指定长度,因为 sql server 中的主键是索引键。
  • 我有很多项目没有指定字符串键的长度。它会自动生成。因此,在我看来,其他地方存在问题。我会错的。
  • 谢谢。我清楚地理解你。我只是想说,有可能在其他地方出错,因为用户代码不够清晰,无法做出决定。无论如何,我希望您的回答对用户有所帮助
  • 您所指的链接是从 2010 年开始的(可能是 EF 1、2、3 或其他版本),从那时起,EF 和 EF Core 发展了很多。现在 EF6 和 EF Core 都不需要明确指定最大长度,所以@Anton 提出了一个有效点。您可以自己尝试(只要OrganizationUser 是错误消息中的User)- SqlServer 的 EF Core 默认假定字符串键属性的最大长度 = 450。
猜你喜欢
  • 2021-12-01
  • 2012-10-19
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2021-04-17
  • 2021-12-22
相关资源
最近更新 更多