首先使用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
属性时,为什么会发生这种情况?删除和重新创建我的表没有区别。
答案 0 :(得分:10)
SQL Server不支持string
列类型的标识。 (你怎么期望这样的字符串看起来像?)为了使这个工作,你可以 - 例如 - 在SQL Server中添加一个计算列/用户定义函数,格式化普通int标识列中的字符串 - 如图所示{{3 }}
答案 1 :(得分:7)
Key
属性。并且无需使用virtual
作为主键。Identity
用于字符串数据类型。试试这段代码:
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