当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将DateTime属性的默认值设置为System.ComponentModel内的DateTime.Now默认值Attrbute》经验,为你挑选了7个好方法。

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

例如我试试这个:

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

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

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

干杯,

安德鲁



1> Daniel Brück..:

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

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

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;


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

2> 小智..:

将下面添加到DateTime属性

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]


.Computed用于添加和更新操作。将.Identity仅用于添加。
这实际上是我一直在寻找的东西,应该会越来越高。许多其他答案的确会在插入实体时添加当前日期,但是不会影响架构(即,使getdate()为默认值)。对我来说,问题是当我想将记录直接添加到表中(使用SQL)时,我必须提供日期(或将其保留为NULL)。这是一个更好的解决方案。谢谢。

3> d512..:

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

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

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

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



4> Sampath..:

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

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

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(b => b.Created)
            .HasDefaultValueSql("getdate()");
    }
}

官方文件



5> 小智..:

这很简单:

对于 DateTime.MinValue

[System.ComponentModel.DefaultValue(typeof(DateTime), "")]

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

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



6> Terence Goll..:

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

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



7> 小智..:

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

Created DATETIME2 NOT NULL DEFAULT GETDATE()

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有