2014-02-13 69 views
0

我面臨的一個問題是,當我設置一個字段的值不爲空時,EF將更新數據庫。EF附加不會更新數據庫字段爲空

但是,當我清除字段(輸入[文本]爲空)時,數據庫中的匹配字段不會更新爲NULL。

這裏是代碼:

C#由EF

exec sp_executesql N'update [dbo].[Plantas] 
set [CodEstado] = @0, [NomePlanta] = @1, [CEP] = @3 
where ([CodPlanta] = @4) 
',N'@0 int,@1 varchar(200),@3 char(8),@4 int', 
@0=26, 
@1='Apiaí', 
@2='Integrada', 
@3='18320000', 
@4=373 
go 

看到,當vm.Telefonevm.Fax,這些字段將不會在UPDATE查詢顯示生成

var entidade = new Plantas { CodPlanta = vm.CodPlanta }; 
db.Plantas.Attach(entidade); 

entidade.CodEstado = vm.CodEstado; 
entidade.NomePlanta = vm.NomePlanta; 
entidade.CEP = vm.CEP; 
entidade.Telefone = vm.Telefone; 
entidade.Fax = vm.Fax; 

db.SaveChanges(); 

SQL。但是如果有一些價值,他們會。

即使字段之前有一些值。

如果在db.Savechanges()處放置斷點,它將顯示entidade.Telefone = null。但它不會去生成的查詢。

如何強制實體框架將字段設置爲空?

回答

1

我發現,設置連接實體的實例,以「修改」作品:

db.Entry(entidade) = EntityState.Modified; 
db.SaveChanges(); 
1

原因是EF只會保存修改的字段。因此,如果在附加對象之前該字段爲空,並且您將其重新設置爲空,則EF不會更新數據庫。

解決方案非常簡單:在附加對象之前將字段設置爲非空值,而不是在保存之前將其修改爲空。

一個警告:如果您對該字段具有樂觀的併發控制,則可能必須從數據庫中讀取記錄,而不是附加空對象。或者,對樂觀併發控制使用一列,例如版本號或SQL Server時間戳列。

例如,假設您在CEP列中遇到此問題。然後做:

var entidade = new Plantas { CodPlanta = vm.CodPlanta }; 

entidade.CEP = "fake old value"; 

db.Plantas.Attach(entidade); 

entidade.CEP = vm.CEP; 

db.SaveChanges(); 
+0

字段不爲空更新之前,他們的價值和我設置爲null。所以我正在改變價值。 –

+0

該字段在數據庫中不爲空,但在附加的內存中的對象爲空。內存中的對象不會更改,因此EF認爲沒有理由將更改傳播到數據庫。 EF無法知道列中包含的數據庫中的空值以外的內容,因爲您沒有告知它。你可以通過閱讀而不是附加,但效率不高。或者你可以僞造它,如我的答案中所示。你試過了嗎? –

+0

ahhh好!我試過了,它工作。我認爲「字段null之前」是db字段。但我還有一個問題......有一個簡單的方法嗎?也許是一些強制所有字段被修改狀態的屬性?因爲有幾個字段,我發佈的代碼只是一個示例.. –