强制 Entity Framework 遵循数据库中定义的约束
Enforce Entity Framework to follow constraints defined in database
我有一个包含 10 列的 table,其中 7 列不为空且有约束。
ALTER TABLE [dbo].[MyTable]
ADD DEFAULT (1) FOR [Column1]
现在,当我像下面这样从 Entity Framework 中插入 3 列时,它不会将默认值插入 table:
Table obj1 = new Table();
obj1.Column7 = someValue;
obj1.column8 = someValue;
obj1.column9 = someValue;
context.Entry(obj1).State = EntityState.Added;
context.SaveChanges();
与我的预期不同,上面的语句只是更新了 3 列,并没有使用其他 7 列的默认值。
如何强制 Entity Framework 在数据库中插入由约束定义的默认值?
在您的 SQL 服务器 table 结构中定义的默认值 仅适用 如果您有一个 INSERT
声明 省略了 那些列 - 例如不为这些列提供任何值(包括 NULL
)。
然而,EF 将始终为实体定义的 all 列提供值 - 例如它将为任何未明确设置的值提供 NULL
。据我所知,您对此无能为力。
有一些解决方法:
您可以创建一个 存储过程,它只接受您想要提供的那些值,并且 运行 一个 SQL INSERT
语句将 省略 具有默认值的列,例如
INSERT INTO dbo.MyTable (colA, colB, ..., colZ) -- *exclude* "Column1" here!
VALUES ( .........)
有了这个,SQL 服务器将使用配置的 默认值 用于那些已定义但未在 [的列列表中提及的列=15=]声明
您可以通过指定第二个 class 在 EF 级别上做类似的事情,这将与您当前的实体 class 几乎相同 - 但那会 省略 您希望由SQL 服务器配置的默认值设置的列。如果您保存此 "slimmed down" 实体,EF 将创建一个 SQL 语句,其中 仅包含它知道的那些列 (根据精简的字段down class),这将导致与上面基本相同的结果 - INSERT INTO
声明 排除 那些由已配置的 [=57= 自动设置的列] 服务器默认约束
我有一个包含 10 列的 table,其中 7 列不为空且有约束。
ALTER TABLE [dbo].[MyTable]
ADD DEFAULT (1) FOR [Column1]
现在,当我像下面这样从 Entity Framework 中插入 3 列时,它不会将默认值插入 table:
Table obj1 = new Table();
obj1.Column7 = someValue;
obj1.column8 = someValue;
obj1.column9 = someValue;
context.Entry(obj1).State = EntityState.Added;
context.SaveChanges();
与我的预期不同,上面的语句只是更新了 3 列,并没有使用其他 7 列的默认值。
如何强制 Entity Framework 在数据库中插入由约束定义的默认值?
在您的 SQL 服务器 table 结构中定义的默认值 仅适用 如果您有一个 INSERT
声明 省略了 那些列 - 例如不为这些列提供任何值(包括 NULL
)。
EF 将始终为实体定义的 all 列提供值 - 例如它将为任何未明确设置的值提供 NULL
。据我所知,您对此无能为力。
有一些解决方法:
您可以创建一个 存储过程,它只接受您想要提供的那些值,并且 运行 一个 SQL
INSERT
语句将 省略 具有默认值的列,例如INSERT INTO dbo.MyTable (colA, colB, ..., colZ) -- *exclude* "Column1" here! VALUES ( .........)
有了这个,SQL 服务器将使用配置的 默认值 用于那些已定义但未在 [的列列表中提及的列=15=]声明
您可以通过指定第二个 class 在 EF 级别上做类似的事情,这将与您当前的实体 class 几乎相同 - 但那会 省略 您希望由SQL 服务器配置的默认值设置的列。如果您保存此 "slimmed down" 实体,EF 将创建一个 SQL 语句,其中 仅包含它知道的那些列 (根据精简的字段down class),这将导致与上面基本相同的结果 -
INSERT INTO
声明 排除 那些由已配置的 [=57= 自动设置的列] 服务器默认约束