C# DatabaseGenerateOption.Identity未生成Id
首先使用EntityFramework代码,我创建了一个简单的C# DatabaseGenerateOption.Identity未生成Id,c#,asp.net-mvc,entity-framework,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; } } 但是,每当我尝试插入新行时,我都会得到一个无法将值NULL插入列“Id”。
Foo
表。这是我的实体:
public class Foo
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual string Id { get; set; }
public virtual string Name { get; set; }
}
但是,每当我尝试插入新行时,我都会得到一个无法将值NULL插入列“Id”
。当我添加了一个DatabaseGenerated
属性时,为什么会发生这种情况?删除和重新创建我的表没有任何区别
键
属性。主键不需要使用virtual
Identity
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual string Name { get; set; }
}
SQL Server不支持
字符串
列类型的标识。(您认为这样的字符串应该是什么样子的?)要实现这一点,您可以—例如—在SQL Server中添加一个计算列/用户定义函数,用于格式化普通int-identity列中的字符串—如图所示。我知道这是一个旧线程,但对于将来的任何人来说:
DatabaseGenerated(DatabaseGeneratedOption.Identity)
不生成任何值,它只是让EF知道DB假设生成如中所述的值。因此,您必须在数据库、模型中设置默认值,或在控制器中指定实际值。对于2020年阅读此内容的任何人,使用实体框架支持字符串列类型的“标识”属性。例如,使用
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性标记装饰C#类中的字符串类型属性,然后让Entity Framework通过数据库第一次迁移创建表,并使用Entity Framework方法(AddAsync()
,SaveAsync()
),自动生成一个类似于“b652daab-9bb9-5143-a1ae-97a89232ea38”的字符串。
但是,MS SQL Server不会自动生成此值(我使用Insert SQL语句对其进行了测试)。相反,程序/实体框架似乎生成了它。正如Treadmeister所说,identity可以与
字符串Id一起正常工作,至少与实体框架核心3+一起工作。我的问题是从Web应用程序传递一个Id为的对象:“
它是字符串。空的不是空的
,因此EF Core没有生成新的Id
创建的表是否显示Id
列被标记为标识
?底层数据库是什么?SQL小姐?Oracle?@DStanleyId
列未标记为标识。基础数据库是MS SQL。您使用的是什么版本的EF?还有其他更改吗?架构名称?连接字符串?@DStanley我正在使用EF6。其他一切都没有改变(我一直在重新创建数据库,所以我不确定这是否有关系)!字符串也不能用作标识。我对此有问题,信不信由你,我通过将Id的属性名从Id更改为{className}Id使其正常工作。不过我使用的是Guid类型。我知道这很旧,但[Key]属性允许使用long
数据类型吗?我遵循asp.net的做法,它使用一个字符串作为id.列。你知道这个实例中的值是如何生成的吗?@Jonathan:我不知道,但我可以想象它不是由数据库生成的,而是一个必须手动设置为唯一值的字符串(如用户名或转换为字符串的guid)。