Mon*_*mer 12 c# entity-framework asp.net-core-mvc
我正在学习ASP.NET核心MVC,我的模型是
namespace Joukyuu.Models
{
public class Passage
{
public int PassageId { get; set; }
public string Contents { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
该Passage表用于保存我写的段落.
Create视图只有一个字段Contents来输入一个段落. CreatedDate并且ModifiedDate必须由服务器自动设置为相等(使用UTC格式).
Edit视图只有一个字段Contents来编辑一个段落.ModifiedDate必须由服务器自动设置.
根据上述场景,我必须将哪些属性附加到CreatedDate和ModifiedDate属性以使它们由服务器自动填充?
Bas*_*ili 28
我必须将哪些属性附加到CreatedDate和ModifiedDate属性,以使服务器根据上述方案自动填充它们?
解决方案1)
namespace Joukyuu.Models
{
public class Passage
{
public int PassageId { get; set; }
public string Contents { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
public Passage()
{
this.CreatedDate = DateTime.UtcNow;
this.ModifiedDate = DateTime.UtcNow;
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过编辑,您必须自己更改/更新它!
解决方案2)
自定义属性:
[SqlDefaultValue(DefaultValue = "getutcdate()")]
public DateTime CreatedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
解决方案3)
在计算的帮助下:
[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedUtc { get; set;
"dbo.Products",
c => new
{
ProductId = c.Int(nullable: false, identity: true),
Name = c.String(),
CreatedUtc = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
})
.PrimaryKey(t => t.ProductId);
Run Code Online (Sandbox Code Playgroud)
解决方案4) 您也可以通过手动修改查询来执行命令拦截器.
解决方案5) 使用Repository模式管理数据创建并通过CreateNew进行设置这是我最喜欢的解决方案!
https://msdn.microsoft.com/en-us/library/ff649690.aspx
解决方案6) 只需在UI或虚拟机中设置或进入.
在Entity Framework Core 1.0中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Passage>()
.Property(b => b.CreatedDate )
.HasDefaultValueSql("getdate()");
}
Run Code Online (Sandbox Code Playgroud)
对于那些使用异步系统(SaveChangesAsync)和.net core的用户,最好将以下代码添加到DbContext类中。
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
var AddedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Added).ToList();
AddedEntities.ForEach(E =>
{
E.Property("CreationTime").CurrentValue = DateTime.Now;
});
var EditedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Modified).ToList();
EditedEntities.ForEach(E =>
{
E.Property("ModifiedDate").CurrentValue = DateTime.Now;
});
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)
并且您还可以定义如下的类或接口。
public class SaveConfig
{
public DateTime CreationTime { get; set; }
public DateTime? ModifiedDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
只是从SaveConfig类继承实体。
如果您首先使用代码,您可以试试这个
[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
关于迁移
AddColumn("Passage", "CreatedDate", n => n.DateTime(nullable: false, defaultValueSql: "GETDATE()"));
Run Code Online (Sandbox Code Playgroud)
或者您可以全局覆盖
saveChangesNote* 如果您有该CreatedDate字段,这将影响整个模型
public override int SaveChanges()
{
DateTime saveTime = DateTime.Now;
foreach (var entry in this.ChangeTracker.Entries()
.Where(e => e.State == (EntityState) System.Data.EntityState.Added))
{
if (entry.Property("CreatedDate").CurrentValue == null)
entry.Property("CreatedDate").CurrentValue = saveTime;
}
return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12503 次 |
| 最近记录: |