Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DatabaseGenerateOption.Identity未生成Id_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# DatabaseGenerateOption.Identity未生成Id

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”。

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

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

    public virtual string Name { get; set; }
}
但是,每当我尝试插入新行时,我都会得到一个
无法将值NULL插入列“Id”
。当我添加了一个
DatabaseGenerated
属性时,为什么会发生这种情况?删除和重新创建我的表没有任何区别

  • 您忘记了
    属性。主键不需要使用
    virtual
  • 正如Slauma所提到的,不能对字符串数据类型使用
    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?@DStanley
    Id
    列未标记为标识。基础数据库是MS SQL。您使用的是什么版本的EF?还有其他更改吗?架构名称?连接字符串?@DStanley我正在使用EF6。其他一切都没有改变(我一直在重新创建数据库,所以我不确定这是否有关系)!字符串也不能用作标识。我对此有问题,信不信由你,我通过将Id的属性名从Id更改为{className}Id使其正常工作。不过我使用的是Guid类型。我知道这很旧,但[Key]属性允许使用
    long
    数据类型吗?我遵循asp.net的做法,它使用一个字符串作为id.列。你知道这个实例中的值是如何生成的吗?@Jonathan:我不知道,但我可以想象它不是由数据库生成的,而是一个必须手动设置为唯一值的字符串(如用户名或转换为字符串的guid)。