我遇到的问题是,当我将字段设置为空值时,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.Telefone
和vm.Fax
时看到这些字段不会在UPDATE查询中显示。但如果放一些价值,他们就会。
即使字段之前有某些值。
如果在db.Savechanges()
处设置断点,则会显示entidade.Telefone = null
。但它不会转到生成的查询。
如何强制Entity Framework将字段设置为null?
答案 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();