C# 实体框架null应在插入/更新时调用SQL默认值

C# 实体框架null应在插入/更新时调用SQL默认值,c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,使用EF6,在insert/update期间,我希望能够在null上调用DB default逻辑,但如果我传入一个值,就会覆盖该默认值 目前看来,我只有两个相互排斥的选择: 开箱即用地将传入的null写入记录 如果我在EF模型上将entity字段属性更改为“Computed”,它将使用DB默认逻辑进行填充(例如getdate()),但会忽略传入的内容 这是第一个使用.NETFramework 4.6的DB项目 用例: 在DB中创建/修改日期时间列,默认为getdate() 默认设置其他非空字段

使用EF6,在insert/update期间,我希望能够在null上调用DB default逻辑,但如果我传入一个值,就会覆盖该默认值

目前看来,我只有两个相互排斥的选择:

  • 开箱即用地将传入的null写入记录

  • 如果我在EF模型上将entity字段属性更改为“Computed”,它将使用DB默认逻辑进行填充(例如getdate()),但会忽略传入的内容

  • 这是第一个使用.NETFramework 4.6的DB项目

    用例: 在DB中创建/修改日期时间列,默认为getdate() 默认设置其他非空字段


    有一些旧帖子无法做到这一点(),然后是今年夏天的一篇帖子,它已经在.NET Core中解决了,但是没有关于细节的信息,如果在.NET Framework中也有相同的解决方案。

    在我的一个旧项目中,我通过将
    DateTime
    属性设置为null并添加到迁移
    defaultValueSql:“GETUTCDATE()”
    中解决了这个问题。我使用了两个不同的列,
    InsertedDateTimeUtc
    UpdatedDateTimeUtc
    来了解它是何时添加和何时更新的。更新值由我自己在实体的存储库中设置。我建议也使用两个单独的列,以获得更精确的信息并避免您的问题。因此,数据库中的默认值是
    getdate()
    ,用于列。是的,但仅用于插入列。更新列是由我自己设置的,但您可以设置一个拦截器使其干燥。我看到的唯一解决方案是使用数据库触发器。未找到解决方案;因此,对于CreatedDate,我在模型中将其设置为Computed;对于ModDate,我从IModDate继承了相关的API模型,它有一个属性,然后在Add/Update操作中我可以使用这一行:var md=(T作为IModDate);如果(md!=null)md.ModDate=DateTime.Now;