【问题标题】:ASP MVC Code First working with datetime computed columnsASP MVC Code First 使用日期时间计算列
【发布时间】:2016-03-10 13:14:12
【问题描述】:

我经历了许多示例,试图弄清楚如何在通过unitOfWorkRepository pattern 保存更改时为每个实体自动设置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; }

    }

这个类实现了IAutoGenerateDateFields接口:

    interface IAutoGenerateDateFields
    {
        DateTime CreatedDate { get; set; }
      //  DateTime ModifiedDate { get; set; }
    }

最后在我的unitOfWork 类中,我检查添加/修改的实体是否实现了上述接口并将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 不能为空。因此,实体不会设置为当前日期。

我在这里错过了什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc code-first unit-of-work


    【解决方案1】:

    删除[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 属性,因为您在代码中生成值。

    我昨天基本上做了同样的事情,下面的代码工作正常:

            var pendingChanges = GetContext().ChangeTracker.Entries<T>().Select(e => e.Entity).ToList();
    
            foreach (var entity in pendingChanges)
            {
                entity.DateModified = DateTime.Now
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2020-07-28
      • 1970-01-01
      相关资源
      最近更新 更多