[英]Entity Framework CTP 4. “Cannot insert the value NULL into column” - Even though there is no NULL value
我使用 EF CTP 4。我有一個簡單的控制台應用程序(用於測試目的),它使用 EF 將一些數據插入到 SQL 數據庫中。
我遇到了一個問題,在插入項目時
using(var context = GetContext())
{
BOB b = new BOB();
b.Id = 1;
context.Bobs.Add(b);
context.SaveChanges();
}
它拋出錯誤: {“無法將值 NULL 插入列 'Id',表 'TestDB.dbo.BOB';列不允許為空。INSERT 失敗。\\r\\n語句已終止。”}
該表只有 1 個Id int NOT NULL字段,它是主鍵,不是自動遞增的 Id。
在創建 DataContext 時,我有這個配置,是的確實會被解雇。
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<BOB>().HasKey(b => b.Id);
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}
我也預先填充了這個表,然后通過調試器能夠通過watch加載這個 BOB 對象......所以我真的很難過,至於能夠加載我的 BOB 表明一切正常......但是插入一個新的它會崩潰......
我在這里有同樣的問題,這真的是一個丑陋的解決方案。
[Key]
public Int64 PolicyID { get; set; }
這不是自動生成的數字
然后我遇到了同樣的錯誤。
EF Code First CTP5
應用此后:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 PolicyID { get; set; }
那么它會起作用。
我正在使用EF 4.1, Model First
並遇到了這個問題。 這是我解決它的方法:
當使用模型設計器表面時,當你創建一個實體時,你必須定義一個Key
屬性,它默認為Id, int32
。
在我的情況下,我選擇使用Guids
作為Id
,所以我將int32
切換到Guid
。 但是,如果您在創建實體后檢查此 Id,我會看到 Id 的'StoreGeneratedPattern'
'identity'
選擇了'identity'
。 起初我不認為這是一個問題,但是當我檢查用於插入數據庫的 SQL 時,有點奇怪,因為它沒有發送我的 ID。 令人沮喪!
但是,一旦我回去將'StoreGeneratedPattern'
從'identity'
更改為'none'
,重新生成數據庫並重建項目,這個奇怪的消息就停止發生了:
無法將值 NULL 插入列“Id”、表“TestDB.dbo.BOB”; 列不允許空值。 插入失敗。 該聲明已被終止。
僅供參考-通過查看SQL的更多一些,似乎如果你有identity
選擇了StoreGeneratedPattern
的EF保存對象,以分貝(沒有編號),然后馬上回來取的身份,並保存該回你的對象。 即StoreGeneratedPattern
這個選擇依賴於數據庫來生成您的 ID,而不是您的代碼!
您是否嘗試過明確指定StoreGeneratedPattern
?
modelBuilder.Entity<BOB>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.StoreGeneratedPattern = StoreGeneratedPattern.None;
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
你也可以使用
modelBuilder.Entity<BOB>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
當我在 db 模式中的受尊重列(身份列)上缺少主鍵時,這發生在我身上。 我在 SQL 服務器之間導出數據,使用 SSMS 導出工具並創建一個新數據庫,但沒有意識到它只導出數據,沒有密鑰。
我有類似的情況,但在我的情況下,即使將Identity
設置為off
也無濟於事。
問題與主鍵有關,我沒有將其添加到我的實體模型中。
這是生成模型的腳本:
CREATE TABLE [im].[SomeGroup]
(
[Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
[OtherGroupId] INT NOT NULL,
[Title] NVARCHAR(512) NOT NULL
)
上面的 C# 代碼是:
Insert(new SomeGroup
{
// I'm not providing Id here, cause it will be auto-generated
SomeGroupId = otherGroup.Id,
Title = otherGroup.Title
});
這里也有一些解釋。
如果您使用的是數據庫優先方法,那么首先從 edmx 圖中刪除相應的實體,然后從數據庫中更新模型,這肯定會解決您的問題
就我而言,EntityFramework 在Context.cs
類中生成了此代碼:
modelBuilder.Entity<MODEL_OF_TABLE>(entity =>
{
entity.Property(e => e.Id).ValueGeneratedNever(); // <= this line must remove
...
}
刪除此行后,問題解決。
也遇到了這個問題。 對我來說,我的開發數據庫表由於某種原因沒有帶來密鑰,所以 EF 沒有將我的 ID 定義為密鑰。
遇到此問題的任何人請注意:確保您嘗試將新記錄插入到帶有 ID 字段的表實際上是在您的 Context 類中定義的。
modelBuilder.Entity<CustomerEmail>(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK_tblCustomerEmail");
entity.Property(e => e.Customer).IsUnicode(false);
entity.Property(e => e.Email).IsUnicode(false);
});
我知道這個問題在某種程度上已經過時並且已經找到了一個公認的解決方案,但是我認為如果我分享我的發現會很有用。
我今天遇到了這個錯誤,因為我使用了同一個DataContext
兩個不同實例。 我正在創建一個具有一些屬性的新模型 - 這些屬性的值是使用DataContext
一個實例從數據庫加載的,然后我試圖將這個新創建的模型推送到數據庫中,首先調用Add()
然后調用SaveChanges()
DataContext
不同實例。 在我開始使用相同的實例來獲取屬性值並實際添加和保存新對象之后 - 一切都開始工作了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.