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

asp.net asp.net-core-2.1 c# ef-core-2.1 entity-framework

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

例如我试试这个:

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

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

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

干杯,

安德鲁

一般承认的答案

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

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

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;

热门答案

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

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

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

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因