2016-03-10 5 views
0

Я рассмотрел множество примеров, пытаясь выяснить, как автоматически установить значение CreatedDate для каждого объекта при сохранении изменений до unitOfWork и Repository pattern.ASP MVC Code Сначала работает с вычисляемыми столбцами datetime

Так что у меня есть просто 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 не может быть пустым. Таким образом, объект не устанавливается с текущей датой.

Что мне здесь не хватает?

ответ

2

Удалить атрибут [DatabaseGenerated(DatabaseGeneratedOption.Computed)], так как вы генерируете значение в своем коде.

Я в основном сделал то же самое вчера, и следующий код работает отлично:

 var pendingChanges = GetContext().ChangeTracker.Entries<T>().Select(e => e.Entity).ToList(); 

     foreach (var entity in pendingChanges) 
     { 
      entity.DateModified = DateTime.Now 
     } 
+1

что сделал трюк. Спасибо! – JustLearning