ASP MVC 代码首先使用日期时间计算列
ASP MVC Code First working with datetime computed columns
我研究了很多例子,试图弄清楚如何在通过 unitOfWork
和 Repository pattern
.[=23 保存更改时自动为每个实体设置 CreatedDate
值=]
所以我有的很简单POCO
:
public class Partners:IAutoGenerateDateFields
{
[Key]
public int PartnerId { get; set; }
public string PartnerCode { get; set; }
public string PartnerName { get; set; }
public string CompanyName { get; set; }
public string City { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string TaxId { get; set; }
public int PartnerTypeId { get; set; }
public int PartnerStateId { get; set; }
public int LocationId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate { get; set; }
// [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
// public DateTime ModifiedDate { get;set;}
public virtual Locations Location { get; set; }
}
这个Class实现了IAutoGenerateDateFields
接口:
interface IAutoGenerateDateFields
{
DateTime CreatedDate { get; set; }
// DateTime ModifiedDate { get; set; }
}
最后在我的 unitOfWork
class 中,我检查 added/modified 实体是否实现了上述接口并将 CreatedDate
值设置为当前日期:
public void Save() {
context.ChangeTracker.DetectChanges();
var added = context.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added)
.Select(t => t.Entity).ToArray();
foreach (var entity in added) {
if (entity is IAutoGenerateDateFields) {
var track = entity as IAutoGenerateDateFields;
track.CreatedDate = DateTime.Now;
}
}
var modified = context.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Modified)
.Select(t => t.Entity).ToArray();
foreach (var entity in modified) {
if (entity is IAutoGenerateDateFields) {
var track = entity as IAutoGenerateDateFields;
track.CreatedDate = DateTime.Now;
}
}
context.SaveChanges();
}
但每次我点击 savechanges
时,我都会收到一个错误,提示 CreatedDate
不能为空。因此,实体不会设置当前日期。
我在这里错过了什么?
删除 [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
属性,因为您在代码中生成了该值。
我昨天基本上做了同样的事情,下面的代码工作正常:
var pendingChanges = GetContext().ChangeTracker.Entries<T>().Select(e => e.Entity).ToList();
foreach (var entity in pendingChanges)
{
entity.DateModified = DateTime.Now
}
我研究了很多例子,试图弄清楚如何在通过 unitOfWork
和 Repository pattern
.[=23 保存更改时自动为每个实体设置 CreatedDate
值=]
所以我有的很简单POCO
:
public class Partners:IAutoGenerateDateFields
{
[Key]
public int PartnerId { get; set; }
public string PartnerCode { get; set; }
public string PartnerName { get; set; }
public string CompanyName { get; set; }
public string City { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string TaxId { get; set; }
public int PartnerTypeId { get; set; }
public int PartnerStateId { get; set; }
public int LocationId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate { get; set; }
// [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
// public DateTime ModifiedDate { get;set;}
public virtual Locations Location { get; set; }
}
这个Class实现了IAutoGenerateDateFields
接口:
interface IAutoGenerateDateFields
{
DateTime CreatedDate { get; set; }
// DateTime ModifiedDate { get; set; }
}
最后在我的 unitOfWork
class 中,我检查 added/modified 实体是否实现了上述接口并将 CreatedDate
值设置为当前日期:
public void Save() {
context.ChangeTracker.DetectChanges();
var added = context.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added)
.Select(t => t.Entity).ToArray();
foreach (var entity in added) {
if (entity is IAutoGenerateDateFields) {
var track = entity as IAutoGenerateDateFields;
track.CreatedDate = DateTime.Now;
}
}
var modified = context.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Modified)
.Select(t => t.Entity).ToArray();
foreach (var entity in modified) {
if (entity is IAutoGenerateDateFields) {
var track = entity as IAutoGenerateDateFields;
track.CreatedDate = DateTime.Now;
}
}
context.SaveChanges();
}
但每次我点击 savechanges
时,我都会收到一个错误,提示 CreatedDate
不能为空。因此,实体不会设置当前日期。
我在这里错过了什么?
删除 [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
属性,因为您在代码中生成了该值。
我昨天基本上做了同样的事情,下面的代码工作正常:
var pendingChanges = GetContext().ChangeTracker.Entries<T>().Select(e => e.Entity).ToList();
foreach (var entity in pendingChanges)
{
entity.DateModified = DateTime.Now
}