DatabaseGeneratedOption.Identity不生成Id

时间:2014-02-25 22:33:47

标签: c# asp.net-mvc entity-framework

首先使用EntityFramework代码,我创建了一个简单的Foo表。这是我的实体:

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual string Id { get; set; }

    public virtual string Name { get; set; }
}

但是每当我尝试插入新行时,我都会得到一个Cannot insert the value NULL into column 'Id'。当我添加DatabaseGenerated属性时,为什么会发生这种情况?删除和重新创建我的表没有区别。

5 个答案:

答案 0 :(得分:10)

SQL Server不支持string列类型的标识。 (你怎么期望这样的字符串看起来像?)为了使这个工作,你可以 - 例如 - 在SQL Server中添加一个计算列/用户定义函数,格式化普通int标识列中的字符串 - 如图所示{{3 }}

答案 1 :(得分:7)

  1. 您忘记了Key属性。并且无需使用virtual作为主键。
  2. 如Slauma所述,您不能将Identity用于字符串数据类型。
  3. 试试这段代码:

    public class Foo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
    
        public virtual string Name { get; set; }
    }
    

答案 2 :(得分:1)

我知道这是一个旧线程,但是对于将来的任何人:

DatabaseGenerated(DatabaseGeneratedOption.Identity)

不生成任何值,它只是让EF知道DB假设要生成MS documentation中所述的值。因此,您必须在数据库中,在模型中设置默认值,或者在控制器中分配实际值。

答案 3 :(得分:1)

对于在2020年阅读此书的任何人,都使用Entity Framework支持字符串列类型的“身份”属性。例如,使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性标记装饰C#类中的字符串类型属性,然后让Entity Framework通过数据库优先迁移创建表,然后使用Entity Framework方法在程序中插入该记录({{ 1}},AddAsync()),会自动生成一个字符串,例如SaveAsync()

MS SQL Server不会自动生成该值(我使用Insert SQL语句对其进行了试验)。相反,程序/实体框架似乎是生成它的。

答案 4 :(得分:1)

正如 Treadmeister 所说,至少在 Entity Framework Core 3+ 的情况下,identity 与 string Id 一起工作正常。我的问题是从带有 Id: "" 的 Web App 传递一个对象,它是 string.Empty 而不是 null 所以 EF Core 没有生成新的 Id