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)
小智 31
将下面添加到DateTime属性
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Run Code Online (Sandbox Code Playgroud)
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.
刚刚发现这是在寻找不同的东西,但在新的 C# 版本中,您可以使用更短的版本:
public DateTime DateCreated { get; set; } = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
如果您使用实体框架,一个简单的解决方案是添加一个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)
我认为最简单的解决方案是设置
Created DATETIME2 NOT NULL DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)
在列声明和VS2010中,EntityModel设计器设置相应的列属性StoreGeneratedPattern = Computed.
使用 System.ComponentModel.DataAnnotations.Schema;
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; private set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140698 次 |
| 最近记录: |