【问题标题】:How to EF code first fluent API string primary key?如何EF编码第一个流畅的API字符串主键?
【发布时间】:2015-10-26 22:54:20
【问题描述】:

我尝试为 Member 实体做一个主键,我不想使用注解,只使用 fluent API:

Member{
    public string MemberID {get;set;}
    ...
}

在成员映射中

this.hasKey(t=>t.MemberID);

更新数据库时出现此错误:

Identity column 'MemberID' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with 
a scale of 0, and constrained to be nonnullable

【问题讨论】:

  • 默认情况下,EF 希望其 PK 列不为空。由于 string 不是值类型,因此它可以为 null。 PK 也必须是某些类型,我认为字符串不是其中之一。另外,EF会使PK的自增,与字符串类型不匹配。

标签: string entity-framework ef-code-first migration primary-key


【解决方案1】:

EF 支持 string 作为 PK,但是当您需要创建 Member 的实例并将其保存到数据库中时,您必须明确设置该属性的某个值。 EF 中默认为 identity 的唯一类型是 int。要解决您的问题,我认为您有两种选择:

  1. 将数据库中的MemberID 列更改为不是Identity。这应该可以解决问题。
  2. 如果您希望 EF 为您进行更改,请添加此配置:

    this.hasKey(t=>t.MemberID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    

    使用Add-Migration 命令创建一个新的迁移并尝试再次运行Update-Database 命令。

现在,如果您的数据库中的 MemberID 列不是 Identity 并且您尝试将模型中的 MemberID PK 属性设置为 Identity,这也可能是您的问题的原因。如果是这种情况,请删除该配置并尝试再次运行Update-Database 命令。

来自Programming Entity Framework Code First本书,第44页:

在 Key 字段为 Integer 的情况下,Code First 默认为 DatabaseGeneratedOption.Identity。使用Guid,您需要明确 配置这个。 这些是您可以配置为的唯一类型 Identity Code First 生成数据库时

【讨论】:

    【解决方案2】:

    问题不在于 PK,而在于 indentity。你应该有类似的东西

    property(x => x.MemberID).HasDatabaseGeneratedOption(
        DatabaseGeneratedOption.None);
    

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多