我有一个包含10列的表,其中有7列不是没有约束的空值。
ALTER TABLE [dbo].[MyTable]
ADD DEFAULT (1) FOR [Column1]
现在,当我从如下所示的Entity Framework中插入3列时,它没有在表中插入默认值:
Table obj1 = new Table();
obj1.Column7 = someValue;
obj1.column8 = someValue;
obj1.column9 = someValue;
context.Entry(obj1).State = EntityState.Added;
context.SaveChanges();
与我的期望不同,以上声明仅更新了3列,而未使用其他7列的默认值。
如何强制实体框架在数据库中插入由约束定义的默认值?
答案 0 :(得分:1)
如果您有一个INSERT
语句删除了这些列的SQL表格结构中定义的默认值仅适用-例如不为这些列提供任何值(包括NULL
)。
EF将始终为实体定义的所有列提供值-例如它会为未明确设置的任何值提供NULL
。据我所知,您对此无能为力。
有一些解决方法:
您可以创建一个存储过程,该存储过程将仅采用您要提供的那些值,并运行一条SQL INSERT
语句以退出具有默认值的列,例如
INSERT INTO dbo.MyTable (colA, colB, ..., colZ) -- *exclude* "Column1" here!
VALUES ( .........)
使用此方法,SQL Server将对那些已定义且未在INSERT INTO
语句的列列表中提及的列使用配置的默认值
您可以通过指定第二个类在EF级别上执行类似的操作,该类与您当前的实体类几乎相同-但这会省去您想要的列由SQL Server的配置默认值设置。如果保存此“精简”实体,则EF会创建一条SQL语句,该语句仅包含它知道的那些列(就精简类的字段而言),这基本上会导致与上述相同-INSERT INTO
语句,排除由配置的SQL Server默认约束自动设置的那些列