EF Attach不会将数据库字段更新为null

时间:2014-02-13 17:09:26

标签: c# entity-framework

我遇到的问题是,当我将字段设置为空值时,EF将更新数据库。

但是,当我清除字段(输入[text]为空)时,DB中的匹配字段将不会更新为NULL。

以下是代码:

C#

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();

EF生成的SQL

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查询中显示。但如果放一些价值,他们就会。

即使字段之前有某些值。

如果在db.Savechanges()处设置断点,则会显示entidade.Telefone = null。但它不会转到生成的查询。

如何强制Entity Framework将字段设置为null?

2 个答案:

答案 0 :(得分:1)

原因是EF只会保存修改后的字段。因此,如果在附加对象之前该字段为null,并且再次将其设置为null,则EF将不会更新数据库。

解决方案非常简单:在附加对象之前将字段设置为null以外的值,而不是在保存之前将其修改为null。

一个警告:如果您对字段有乐观的并发控制,则可能必须从数据库中读取记录而不是附加空对象。或者,使用一列进行乐观并发控制,例如版本号或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();

答案 1 :(得分:1)

我发现将实体的附加实例设置为“已修改”可以使用:

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