【问题标题】:EF Code First: Add row to table with a non-identity primary keyEF Code First:使用非标识主键向表中添加行
【发布时间】:2014-01-28 04:06:03
【问题描述】:

为了将这个问题简化为一个简单的版本,我创建了这个表:

create table TestTable(id int primary key, descr varchar(50))

请注意,id 字段不是身份字段。现在,如果我尝试使用 EF Code First 插入一行:

[Table("TestTable")]
public class TestTable
{
    [Key]
    public int id { get; set; }
    public string descr { get; set; }
}

public class TestContext : DbContext
{
    public TestContext(string connectionString) : base(connectionString) {}
    public DbSet<TestTable> TestTables { get; set; }
}

static void Main()
{
    const string connectionString = "...";
    using (var db = new TestContext(connectionString))
    {
        db.TestTables.Add(new TestTable { id = 42, descr = "hallo" });
        db.SaveChanges();
    }
}

结果是异常:

无法将值 NULL 插入列“id”、表“TestTable”; 列不允许空值。

但插入行的代码指定id = 42。欢迎任何线索或提示。

【问题讨论】:

  • 您是否尝试删除 [Key] 属性?
  • @hunter:是的,我有,导致同样的错误。我怀疑 EF 隐式假设以 Id 结尾的列是键。
  • 尝试使用这个 DataAnotations 选项[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]
  • @Guillelon:很好,看起来很有效!将测试更多。你忘了.Schema.顺便说一句,全名是System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None
  • @Andomar 是的,对不起,我正要编辑它并像这样[DatabaseGenerated(DatabaseGeneratedOption.None)] ;) 希望它有效!

标签: c# sql-server entity-framework ef-code-first


【解决方案1】:

只需添加这个 DataAnnotations [DatabaseGenerated(DatabaseGeneratedOption.None)] 和库

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Table("TestTable")]
public class TestTable
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int id { get; set; }
    public string descr { get; set; }
}

【讨论】:

  • 如果使用了DatabaseGenerated(DatabaseGeneratedOption.Identity,但表键列仍然是int(不是identity),EF核心会生成一个新的int主键值吗?(或者它会给出异常)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多