通过Entity Framework插入当前数据库日期时间

3
我们希望将当前日期时间放入数据库列中。
我们有一个Web农场,Web服务器上的时间可能会有所不同,因此我们需要使用数据库服务器上的日期时间。
我们有一个具有NotNull日期时间列的数据库。 该列具有默认日期时间为当前时间。
当我们使用不包括日期时间列的SQL语句插入数据时,这很好用。
来自Entity Framework:
- 如果我们将日期时间定义为非空,则日期时间设置为较低日期,并将较低日期插入到数据库中。 - 如果我们将日期时间定义为空,则在插入时会收到值不能为空的异常。
我们可以使用数据库触发器来修复这个问题,如果插入值是低日期,则将日期时间更改为当前日期时间。
有没有更好的解决方案?
2个回答

9

由于数据库设置了默认值,因此您可以将日期时间列标记为计算列:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
property DateTime Date { get; set; }

或者使用流畅映射。
this.Property(t => t.Date)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

在一个 EntityTypeConfiguration 类中,或者...
modelBuilder.Entity<MyClass>().Property(t => t.Date)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

OnModelCreating重写中执行此操作。

这将导致EntityFramework在每次读取、插入或更新记录时都读取列的值,但它永远不会设置它。


谢谢您的回答,如果我们有一个EDMX文件,这个方法也适用吗?每次EDMX更改并重新生成代码时,我们需要重新添加属性吗? - Shiraz Bhaiji
在edmx中,您可以在设计器中的属性窗口中将“StoreGeneratedPattern”设置为“Computed”。这将在模型更新后保留。 - Gert Arnold
谢谢,我们正在使用DB2。DB2驱动程序不支持“Computed”,但我们能够使用“Identity”。虽然它不是一个Identity列,但它解决了向数据库发送低日期的问题。 - Shiraz Bhaiji

-2
一种方法是使用UTC日期时间,因此在C#中可以使用。
DateTime.UtcNow

你也可以设置

DateTime dateTime = new DateTime();
dateTime = SqlDateTime.MinValue.Value;

你甚至可以创建扩展方法:

public static class DateExtension
    {
        public static DateTime SqlValidDateTime(this DateTime d)
        {
            return SqlDateTime.MinValue.Value;
        }
    }

还有:

如果我们将日期时间定义为null,在插入时会出现异常,提示值不能为空。

你应该传递一个非空值,而不是null ->

DbNull.Value 

然后插入应该通过。


从@Shiraz的提问来看,他想要的是服务器数据库中的当前DateTime,而不是可以分配的最小DateTime... - yosbel
@yosoy是正确的,这段代码将从Web服务器上的系统时钟读取时间,所以不幸的是它并没有帮助。 - Shiraz Bhaiji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接