DatabaseGeneratedOption.Identity not generating an Id

和自甴很熟 提交于 2020-07-06 09:14:48

问题


Using EntityFramework code-first, I've created a simple Foo table. Here's my entity:

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

    public virtual string Name { get; set; }
}

However whenever I try to insert a new row, I get a Cannot insert the value NULL into column 'Id'. Why is this happening when I've added a DatabaseGenerated attribute? Deleting and recreating my table makes no difference.


回答1:


Identities for string column types are not supported with SQL Server. (How do you expect such a string to look like?) To get this working you could - for example - add a computed column/user defined function in SQL Server that formats a string from an ordinary int identity column - as shown here.




回答2:


  1. you forgot the Key attribute. and there is no need to use virtual for primary key.
  2. as mentioned by Slauma you can't use Identity for string datatype.

Try this code:

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

    public virtual string Name { get; set; }
}



回答3:


For anybody reading this in 2020, 'Identity' attributes for string column types are supported using Entity Framework. For example, decorating a string type property in your C# class with the [DatabaseGenerated(DatabaseGeneratedOption.Identity)] attribute tag, then letting Entity Framework create the table through a database-first migration, and inserting that record through your program with Entity Framework methods (AddAsync(), SaveAsync()), auto-generates a string that looks like e.g. 'b652daab-9bb9-5143-a1ae-97a89232ea38'.

MS SQL Server will not auto generate this value however (I trialled it with an Insert SQL statement). Instead, the program / Entity Framework seems to generate it.




回答4:


I know that is an old thread, but for anyone in the future:

DatabaseGenerated(DatabaseGeneratedOption.Identity)

does not generate any values, it simply let EF know that DB suppose to generate the value as described in the MS documentation. Therefore you must either set a default value in the database, in your model or assign an actual value in the controller.



来源:https://stackoverflow.com/questions/22027701/databasegeneratedoption-identity-not-generating-an-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!