1

は私が自動的に Entity Frameworkのコアを持つ作成し修正フィールドを持っていると思います。私はhereの解決策を見つけてそれに従った。Entity Frameworkのコア - CreatedTimeガットヌルアップデート

それはデータ -

Add Image

を追加するしかし、私は、(更新時間は完璧ですが、ヌルなったときに作成)のデータを更新しようとしていますし、私はthis-のような問題を取得していた場合のために完璧に働いています

Edit Image

ので、作成するプロパティが失われてしまった(ヌルに設定してください)

this-

public class BaseEntity 
{ 
    [Key] 
    public long Id { get; set; } 

    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss.fff}", ApplyFormatInEditMode = true)] 
    public DateTime? CreatedTime { get; set; } 
    public long CreatorUserId { get; set; } 
    //public string CreatorIPAddress { get; set; } 

    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss.fff}", ApplyFormatInEditMode = true)] 
    public DateTime? LastModifiedTime { get; set; } 
    public long LastModifireUserId { get; set; } 
    //public string LastModifireIPAddress { get; set; } 
} 

そしてDbContextクラスthis-

public class ApplicationDbContext : DbContext 
{ 
    //List all tables here 
    public DbSet<Advertisement> Advertisements { get; set; } 
    public DbSet<Address> Addresses { get; set; } 
    public DbSet<Country> Countries { get; set; } 
    public DbSet<EducationResult> EducationResults { get; set; } 
    public DbSet<Experience> Experiences { get; set; } 
    public DbSet<JobCircular> JobCirculars { get; set; } 
    public DbSet<Language> Languages { get; set; } 
    public DbSet<Reference> References { get; set; } 
    public DbSet<Research> Researches { get; set; } 
    public DbSet<ResearchDegree> ResearchDegrees { get; set; } 
    public DbSet<TeacherApplication> TeacherApplications { get; set; } 
    public DbSet<Training> Trainings { get; set; } 

    //Configure Database Settings 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     //Configuration.GetConnectionString("DefaultConnection"); 
     optionsBuilder.UseSqlite("Filename=./applicationDB.db"); 
    } 

    public override int SaveChanges() 
    { 
     AddTimestamps(); 
     return base.SaveChanges(); 
    } 

    public override int SaveChanges(bool acceptAllChangesOnSuccess) 
    { 
     AddTimestamps(); 
     return base.SaveChanges(acceptAllChangesOnSuccess); 
    } 

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) 
    { 
     AddTimestamps(); 
     return base.SaveChangesAsync(cancellationToken); 
    } 

    public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken)) 
    { 
     AddTimestamps(); 
     return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); 
    } 

    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?.Id) 
      ? HttpContext.Current.User.Identity.Id 
      : -1; //-1 for Anonimous 
     */ 
     long currentUserId = -1; //-1 for Anonimous 

     foreach (var entity in entities) 
     { 
      if (entity.State == EntityState.Added) 
      { 
       ((BaseEntity)entity.Entity).CreatedTime = DateTime.UtcNow; 
       ((BaseEntity)entity.Entity).CreatorUserId = currentUserId; 
       //((BaseEntity)entity.Entity).CreatorIPAddress = HttpContext.Connection.RemoteIpAddress.ToString(); 
      } 
      else 
      { 
       ((BaseEntity)entity.Entity).CreatedTime = ((BaseEntity)entity.Entity).CreatedTime; 
       ((BaseEntity)entity.Entity).CreatorUserId = ((BaseEntity)entity.Entity).CreatorUserId; 
       //((BaseEntity)entity.Entity).CreatorIPAddress = ((BaseEntity)entity.Entity).CreatorIPAddress; 
      } 

      ((BaseEntity)entity.Entity).LastModifiedTime = DateTime.UtcNow; 
      ((BaseEntity)entity.Entity).LastModifireUserId = currentUserId; 
      //((BaseEntity)entity.Entity).LastModifireIPAddress = HttpContext.Connection.RemoteIpAddress.ToString(); 
     } 
    } 

    public DbSet<ApplicationManagement.DbModel.Office> Office { get; set; } 
} 

のようなものであるように私のBaseEntityクラスがある

誰も助けてくださいことはできますか?

+0

私はビューモデルとしてエンティティモデルを使用しています。 –

+0

FWIW、修正されたdatetimeを自動的に更新するためには、次のようなものが必要です。作成されたものはデフォルトでよりうまく処理しなければなりません: 'public DateTime CreatedTime {get;セット; } = DateTime.UtcNow; ' –

+0

あなたはどのようにレコードを照会し更新しているのか投稿してください。上記のコードは書かれているようにエラーを表示していません。 – Smit

答えて

0

これを引き起こす唯一の方法は、エンティティモデルをビューモデルとして使用することです。したがって、フォームから、またはプロパティセットをいくつか設定してAPI呼び出しを介してエンティティを送信していますが、またはCreatorUserIdではなく、nullのデフォルト値を取得しています。

これらのヌルをロードされたエンティティに割り当て、上書きします。

あなたはのviewmodelsを使用してロードされたエンティティに適切なプロパティをマッピングするいずれかの方法でこれを防ぐことができます。

// somewhere in a controller 
public void UpdatePerson(UpdatePersonViewModel model) 
{ 
    var entity = Get(model.Id); 

    entity.Name = model.Name; 

    Save(entity); 
} 

またはその代わりに、私はお勧めしませんのviewmodelのエンティティと同じことをやって。

0

論理的には、変更された状態の場合、作成された時間はオリジナルの作成時間のままです。以下originalValue FOMデシベル

((BaseEntity)entity.Entity).CreatedTime = entity.Property("CreatedTime").OriginalValue; 
+0

それらを追加し、私は 。それらを削除して、それはあなたの答えは? –

+0

が動作していない:( –

0

は、あなたが本当にこのコードが必要です取得するためのスクリプトはありますか?

else 
{ 
    ((BaseEntity)entity.Entity).CreatedTime = ((BaseEntity)entity.Entity).CreatedTime; 
    ((BaseEntity)entity.Entity).CreatorUserId = ((BaseEntity)entity.Entity).CreatorUserId; 
    //((BaseEntity)entity.Entity).CreatorIPAddress = ((BaseEntity)entity.Entity).CreatorIPAddress; 
} 
+0

私はそれらを試してみましたが、そう:( を働いていない –

+0

そのコードは無関係です。私はあなたが作成時にプロパティを再度設定する必要はないと思う。 – Tor

関連する問題