代码之家  ›  专栏  ›  技术社区  ›  Zerotoinfinity HLGEM

强制实体框架遵循数据库中定义的约束

  •  0
  • Zerotoinfinity HLGEM  · 技术社区  · 7 年前

    我有一个有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(); 
    

    如何强制实体框架在数据库中插入由约束定义的默认值?

    0 回复  |  直到 7 年前
        1
  •  1
  •   marc_s MisterSmith    7 年前

    SQL Server表结构中定义的默认值为 仅适用于 INSERT 声明 漏掉 这些列-例如,不提供任何值(包括 NULL )对于那些柱子。

    但EF将始终为 实体定义的列-例如,它将提供 无效的 对于任何未显式设置的值。据我所知,你对此无能为力。

    有一些解决方法:

    • 存储过程 它只接受您想要提供的值,并运行SQL 插入 离开了 具有默认值的列,例如。

      INSERT INTO dbo.MyTable (colA, colB, ..., colZ)  -- *exclude* "Column1" here!
      VALUES ( .........)
      

      对于定义了一个列但未在 INSERT INTO 陈述

    • 您可能可以在EF级别执行类似的操作,方法是指定第二个类,该类与当前的实体类几乎相同,但这将 离开了 要由SQL Server的配置的默认值设置的列。如果保存这个“精简”实体,EF将创建一个SQL语句,其中包括 只有那些列 它所知道的(就瘦身类的领域而言),这将导致与上述基本相同的结果 插入 声明 由配置的SQL Server默认约束自动设置的列