2017-06-08 2 views
0

Ich übte User.Identity und Zeitstempel Funktionen in ASP.NET MVC 5, Also habe ich eine Schülerklasse erstellt einige Eigenschaften gefüllt, wollte ich nur testen, ob es Zeitstempel und userId, so Benutzer erfasst id wird auch erfasst und datetime, Problem ist, wenn ich einen Datensatz bearbeite und es speichere, sein erstelltes Datum wird Null und das geänderte Datum wird aktualisiert, bitte überprüfe den Code und helfe. Vielen Dank im Voraus. ist Sie den Code untenErstellt und geändertes Datum Ausgabe

{ 
public class BaseEntity 
{ 
    public DateTime? DateCreated { get; set; } 
    public string UserCreated { get; set; } 
    public DateTime? DateModified { get; set; } 
    public string UserModified { get; set; } 
} 


public class Student : BaseEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Subject { get; set; } 
    public string Class { get; set; } 
    public Section Section { get; set; } 
    public byte SectionId { get; set; } 
} 

dann habe ich Codefirst Ansatz und erstellt eine Anwendung Datenbank und hinzugefügt diesen Code in Identity Modell

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Student> Students { get; set; } 
    public override int SaveChanges() 
    { 
     AddTimestamps(); 
     return base.SaveChanges(); 
    } 

    //public override async Task<int> SaveChangesAsync() 
    //{ 
    // AddTimestamps(); 
    // return await base.SaveChangesAsync(); 
    //} 

    private void AddTimestamps() 
    { 
     var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified)); 

     var currentUsername = !string.IsNullOrEmpty(System.Web.HttpContext.Current?.User?.Identity?.Name) 
      ? HttpContext.Current.User.Identity.Name 
      : "Anonymous"; 

     foreach (var entity in entities) 
     { 
      if (entity.State == EntityState.Added) 
      { 
       ((BaseEntity)entity.Entity).DateCreated = DateTime.UtcNow; 
       ((BaseEntity)entity.Entity).UserCreated = currentUsername; 
      } 
      else 
      ((BaseEntity)entity.Entity).DateModified = DateTime.UtcNow; 
      ((BaseEntity)entity.Entity).UserModified = currentUsername; 
     } 
    } 
    public DbSet<Section> Sections { get; set; }  
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

ich einen einfachen Controller erstellt haben mit erstellen, bearbeiten und dispay Aktionen.

+0

Ich kann nicht sehen, wie 'DateCreated' von diesem Code auf null gesetzt würde. Es muss irgendwo anders passieren - vielleicht in der Modellbindung. – jpishko

+0

Welcher Code muss überprüft werden? Ich bin total ahnungslos, was schief gelaufen ist: | –

Antwort

0

Der von Ihnen gepostete Code zeigt DateCreated nicht an, so weit ich sehen kann. Ich denke, das Problem ist, wenn Sie einen vorhandenen Datensatz speichern, haben Sie nicht die DateCreated oder UserCreated Felder in Ihrer Ansicht. Wenn Sie also das Formular posten, werden sie vom MVC-Modellordner nicht angezeigt, und sie werden daher auf null gesetzt (ich nehme an, dass Sie in Ihrer Controller-Aktion an das Student-Modell gebunden sind).

In Ihrer bearbeiten Ansicht fügen Sie die folgenden verborgenen Felder:

@Html.HiddenFor(model => model.DateCreated) 
@Html.HiddenFor(model => model.UserCreated) 

Nun, wenn Sie das Formular des MVC-Modell Binder schreiben diese Werte zu Ihrem Modell binden und sie in die Datenbank speichern.