【问题标题】:Set SQL Server time to Entity Framework CreatedOn column将 SQL Server 时间设置为 Entity Framework CreatedOn 列
【发布时间】:2014-11-18 13:03:12
【问题描述】:

我想填写我的实体的CreatedOn 列。我知道覆盖SaveChanges() 并设置值的方法,如下所示:

public override int SaveChanges()
{
    foreach (var item in ChangeTracker.Entries<ITrackableEntity>().Where(c => c.State == EntityState.Added))
    {
        item.Entity.CreatedOn = DateTime.Now;
    }

    return base.SaveChanges();
}

interface ITrackableEntity
{
    DateTime? CreatedOn { get; set; }
}

问题是我正在设置客户端时间,这在我的情况下是不可接受的(多用户桌面应用程序,用户在他们的计算机上可能有不同的时间)。如何将 Sql 服务器时间设置为 CreatedOn 列?我不想在触发器中这样做。我想要一些能翻译成那个 SQL 的东西:

INSERT INTO SomeTable (Column1, CreatedOn)
VALUES Value1, GETDATE();

【问题讨论】:

  • 您混淆了 INSERTUPDATE 语法 - 您不能将 INSERTSET ..... 一起使用。执行此操作的最佳位置是 触发器 - 为什么要断然排除此选项??
  • @marc_s 谢谢,我已经更正了 sql 语法。我相信触发器是我想避免的隐藏逻辑。而且我使用数据库优先的方法,不想编辑我的众多表格。

标签: .net entity-framework


【解决方案1】:

实际的日期时间值有多重要?

如果您不需要精确的值,您可以使用:

var dQuery =dbContext.CreateQuery<DateTime>("CurrentDateTime() ");
DateTime dbDate = oquery.AsEnumerable().First();

原文链接: How to ask database server for current datetime using entity framework?

【讨论】:

  • 不错的解决方法,但有没有额外的数据库查询的替代方案?
  • 您可以使用@xxMURoXX 的建议,但为了将来的可读性,您可以牺牲一个查询来将业务逻辑保存在一个地方恕我直言
【解决方案2】:

您是否更改了对数据库表的权限。如果是这样你可以修改相应的列:

CREATE TABLE test
(
      ...
      CreatedOn DATETIME2(7) NOT NULL DEFAULT(GETDATE())
)

然后,在更新您的 edmx 文件后,您将相应的属性设置为 StoreGeneratedPattern=Computed。现在,您无需在代码中设置 CreatedOn 即可保存您的实体。一切都由 SQL-Server

完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多