有没有人知道如何使用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;
将下面添加到DateTime属性
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
我没有理由认为不应该通过属性做到这一点.它可能在微软的积压中.谁知道.
我发现的最佳解决方案是在代码首次迁移中使用defaultValueSql参数.
CreateTable( "dbo.SomeTable", c => new { TheDateField = c.DateTime(defaultValueSql: "GETDATE()") });
我不喜欢在实体类构造函数中设置它的常用参考解决方案,因为如果除了Entity Framework之外的任何内容在该表中粘贴记录,则日期字段将不会获得默认值.使用触发器来处理这种情况的想法对我来说似乎不对.
我在EF核心2.1上测试了这个
在这里,您不能使用约定或数据注释.您必须使用Fluent API.
class MyContext : DbContext { public DbSetBlogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity () .Property(b => b.Created) .HasDefaultValueSql("getdate()"); } }
官方文件
这很简单:
对于 DateTime.MinValue
[System.ComponentModel.DefaultValue(typeof(DateTime), "")]
对于任何其他值作为DefaultValueAttribute
指定字符串的最后一个参数,表示所需的DateTime值.
此值必须是常量表达式,并且是使用创建object(DateTime
)所必需的TypeConverter
.
如果您使用实体框架,一个简单的解决方案是添加一个partical类并为实体定义一个构造函数,因为框架没有定义一个.例如,如果您有一个名为Example的实体,则将以下代码放在单独的文件中.
namespace EntityExample { public partial class Example : EntityObject { public Example() { // Initialize certain default values here. this._DateCreated = DateTime.Now; } } }
我认为最简单的解决方案是设置
Created DATETIME2 NOT NULL DEFAULT GETDATE()
在列声明和VS2010中,EntityModel设计器设置相应的列属性StoreGeneratedPattern = Computed.