2014-01-09 37 views
10

为了减少这种问题,一个简单的版本,我已经创造了这个表:EF代码第一:添加行表无标识的主键

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

注意,id字段不是身份领域。现在,如果我尝试使用EF代码第一次插入一行:

[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。任何线索或暗示欢迎。

+2

你尝试删除'[关键]'属性? – hunter

+0

@hunter:是的,结果有相同的错误。我假设EF隐含地假设以'Id'结尾的列是关键。 – Andomar

+1

尝试使用此DataAnotations选项'[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]' –

回答

14

只需添加这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; } 
}