2014-09-05 149 views
4

所以我有這樣的代碼,第一類:EF代碼優先 - 無法將NULL值插入列

​​

我用的遷移,我嘗試種子會話表在我的初始化:

IList<Session> defaultSessions = new List<Session>(); 
defaultSessions.Add(new Session() 
{ 
    Start = DateTime.Parse("09/01/2014 14:00:00"), 
    End = DateTime.Parse("09/01/2014 14:10:00"), 
    Type = "pharyngeal", 
    PatientID = 1, 
}); 
foreach (Session session in defaultSessions) 
{ 
    context.Sessions.Add(session); 
} 

SessionID應該是主鍵,並自動增量,這就是爲什麼你使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]的權利?

好還是我得到這個錯誤:

Cannot insert the value NULL into column table column does not allow nulls. INSERT fails. The statement has been terminated

在數據庫中的表看起來像這樣(請注意我用的LocalDB,並且該數據庫實例mssqllocaldb下:
enter image description here
上午什麼我做錯了

編輯: 我注意到,在數據庫中,身份是FALSE,看到這個截圖:
enter image description here
這讓我覺得奇怪,因爲在最新的遷移,我做了身份的定位點(這只是我在這個問題上所提供的類),以及文件看起來像這樣:

public partial class IdentityFixes : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("dbo.Admin"); 
     DropPrimaryKey("dbo.Session"); 
     AlterColumn("dbo.Admin", "AdminID", c => c.Int(nullable: false, identity: true)); 
     AlterColumn("dbo.Session", "SessionID", c => c.Int(nullable: false, identity: true)); 
     AddPrimaryKey("dbo.Admin", "AdminID"); 
     AddPrimaryKey("dbo.Session", "SessionID"); 
    } 

    public override void Down() 
    { 
     DropPrimaryKey("dbo.Session"); 
     DropPrimaryKey("dbo.Admin"); 
     AlterColumn("dbo.Session", "SessionID", c => c.Int(nullable: false)); 
     AlterColumn("dbo.Admin", "AdminID", c => c.Int(nullable: false)); 
     AddPrimaryKey("dbo.Session", "SessionID"); 
     AddPrimaryKey("dbo.Admin", "AdminID"); 
    } 
} 

由於你可以看到,修正中身份設置爲true。我沒有Update-Database所以我不明白爲什麼這是行不通的。

+3

你試過在數據庫上運行探查看到的是實際發送的是什麼查詢? – MattC 2014-09-05 13:18:38

+0

@MATC不,我沒有,因爲我不知道你在說什麼,怎麼做。根據我可以找到關於實體框架的所有文檔,這不應該工作嗎? – QuantumHive 2014-09-05 13:25:32

+0

您可以獲得EFProfiler的演示(使用EF時的關鍵工具),將它集成到您​​的應用程序(Main中的單行)並查看發送到SQL的語句。您的配置看起來很好,所以唯一的調試方法是查看EF發送到數據庫的內容。你也可以嘗試用'context.Sessions.Create()'替換'new Session()'。 – 2014-09-05 13:28:54

回答

0

我有一個類似的問題,由於遷移到現有的數據庫造成的,所以我創建了一個空的遷移並使用SQL代碼,這裏是我的例子:

public override void Up() 
{ 
    DropForeignKey("dbo.Bar", "FooId", "dbo.Foo"); 
    Sql("IF object_id(N'[dbo].[FK_Bar_Foo]', N'F') IS NOT NULL ALTER TABLE [dbo].[Bar] DROP CONSTRAINT [FK_Bar_Foo]"); 
    Sql("CREATE TABLE [dbo].[FooTemp] ([Id] int NOT NULL)"); 
    Sql("INSERT INTO [dbo].[FooTemp] ([Id]) SELECT [Id] FROM [dbo].[Foo]"); 
    Sql("DROP TABLE [dbo].[Foo]"); 
    Sql("CREATE TABLE [dbo].[Foo] ([Id] int IDENTITY (1,1) NOT NULL)"); 
    Sql("SET IDENTITY_INSERT [dbo].[Foo] ON"); 
    Sql("INSERT INTO [dbo].[Foo] ([Id]) SELECT [Id] FROM [dbo].[FooTemp]"); 
    Sql("SET IDENTITY_INSERT [dbo].[Foo] OFF"); 
    Sql("DROP TABLE [dbo].[FooTemp]"); 
    AddPrimaryKey("dbo.Foo", "Id"); 
    AddForeignKey("dbo.Bar", "FooId", "dbo.Foo", "Id"); 
} 

public override void Down() 
{ 
    DropForeignKey("dbo.Bar", "FooId", "dbo.Foo"); 
    Sql("CREATE TABLE [dbo].[FooTemp] ([Id] int NOT NULL)"); 
    Sql("INSERT INTO [dbo].[FooTemp] ([Id]) SELECT [Id] FROM [dbo].[Foo]"); 
    Sql("DROP TABLE [dbo].[Foo]"); 
    Sql("CREATE TABLE [dbo].[Foo] ([Id] int NOT NULL)"); 
    Sql("INSERT INTO [dbo].[Foo] ([Id]) SELECT [Id] FROM [dbo].[FooTemp]"); 
    Sql("DROP TABLE [dbo].[FooTemp]"); 
    AddPrimaryKey("dbo.Foo", "Id"); 
    AddForeignKey("dbo.Bar", "FooId", "dbo.Foo", "Id"); 
} 

HTH