将DateTime属性的默认值设置为System.ComponentModel内的DateTime.Now默认值Attrbute

REA*_*REW 87 c# asp.net entity-framework asp.net-core-2.1 ef-core-2.1

有没有人知道如何使用System.ComponentModel DefaultValue属性为DateTime属性指定默认值?

例如我试试这个:

[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }
Run Code Online (Sandbox Code Playgroud)

并且它期望值是一个恒定的表达式.

这是在使用ASP.NET动态数据的上下文中.我不想构建DateCreated列,但只是提供DateTime.Now,如果它不存在.我使用实体框架作为我的数据层

干杯,

安德鲁

Dan*_*ner 89

您不能使用属性执行此操作,因为它们只是在编译时生成的元信息.只需向构造函数添加代码以在需要时初始化日期,创建触发器并处理数据库中的缺失值,或者以返回DateTime.Now的方式实现getter(如果未初始化支持字段).

public DateTime DateCreated
{
   get
   {
      return this.dateCreated.HasValue
         ? this.dateCreated.Value
         : DateTime.Now;
   }

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;
Run Code Online (Sandbox Code Playgroud)

  • `get`部分可以简化为:`return dateCreated ?? DateTime.Now;` (10认同)
  • 谢谢,在您进行编辑之前,我采取了另一种方法,并拦截了塞特犬。为帮助喝彩:-) (2认同)

小智 31

将下面添加到DateTime属性

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Run Code Online (Sandbox Code Playgroud)

  • .Computed用于添加和更新操作。将.Identity仅用于添加。 (4认同)
  • 迄今为止的最佳答案:应该添加对 System.ComponentModel.DataAnnotations.Schema 的引用,以用于 DatabaseGenerated 注释 (3认同)
  • 将使用什么时区?会是UTC吗? (3认同)
  • 这实际上是我一直在寻找的东西,应该会越来越高。许多其他答案的确会在插入实体时添加当前日期,但是不会影响架构(即,使getdate()为默认值)。对我来说,问题是当我想将记录直接添加到表中(使用SQL)时,我必须提供日期(或将其保留为NULL)。这是一个更好的解决方案。谢谢。 (2认同)
  • 使用 ASP.NET Core 3.1 进行 codefirst 迁移,不幸的是,这没有做任何事情:( 我投了赞成票,因为这是一个很好的答案,但不适合我的情况 (2认同)

d51*_*512 21

我没有理由认为不应该通过属性做到这一点.它可能在微软的积压中.谁知道.

我发现的最佳解决方案是在代码首次迁移中使用defaultValueSql参数.

CreateTable(
    "dbo.SomeTable",
    c => new
        {
            TheDateField = c.DateTime(defaultValueSql: "GETDATE()")
        });
Run Code Online (Sandbox Code Playgroud)

我不喜欢在实体类构造函数中设置它的常用参考解决方案,因为如果除了Entity Framework之外的任何内容在该表中粘贴记录,则日期字段将不会获得默认值.使用触发器来处理这种情况的想法对我来说似乎不对.


Sam*_*ath 12

我在EF核心2.1上测试了这个

在这里,您不能使用约定或数据注释.您必须使用Fluent API.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Created)
            .HasDefaultValueSql("getdate()");
    }
}
Run Code Online (Sandbox Code Playgroud)

官方文件


小智 11

这很简单:

对于 DateTime.MinValue

[System.ComponentModel.DefaultValue(typeof(DateTime), "")]
Run Code Online (Sandbox Code Playgroud)

对于任何其他值作为DefaultValueAttribute指定字符串的最后一个参数,表示所需的DateTime值.

此值必须是常量表达式,并且是使用创建object(DateTime)所必需的TypeConverter.

  • 我愿意相信这种用法对我有用,但不幸的是它没有。迁移结果;`defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)` (2认同)

Bra*_*are 7

刚刚发现这是在寻找不同的东西,但在新的 C# 版本中,您可以使用更短的版本:

public DateTime DateCreated { get; set; } = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案应该得到更多支持。 (2认同)

Ter*_*lla 6

如果您使用实体框架,一个简单的解决方案是添加一个partical类并为实体定义一个构造函数,因为框架没有定义一个.例如,如果您有一个名为Example的实体,则将以下代码放在单独的文件中.

namespace EntityExample
{
    public partial class Example : EntityObject
    {
        public Example()
        {
            // Initialize certain default values here.
            this._DateCreated = DateTime.Now;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*tas 5

我认为最简单的解决方案是设置

Created DATETIME2 NOT NULL DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)

在列声明和VS2010中,EntityModel设计器设置相应的列属性StoreGeneratedPattern = Computed.


Ali*_*eit 5

使用 System.ComponentModel.DataAnnotations.Schema;

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; private set; }
Run Code Online (Sandbox Code Playgroud)

  • 请查看[如何回答](https://stackoverflow.com/help/how-to-answer) (2认同)