Добавление CreatedDate к объекту с использованием Entity Framework 5 Code First

Если вы только вносили изменения и удаляли файл, но не фиксировали его, а теперь вы расстались с вашими изменениями

git checkout -- .

, но ваши удаленные файлы не возвращались, вы просто выполняете следующую команду :

git checkout <file_path>

И престо, ваш файл вернулся.

29
задан Community 23 May 2017 в 12:09
поделиться

7 ответов

Вот как я это сделал:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate{ get; set; }

в методе Up () моей миграции:

AddColumn("Agents", "CreatedDate", n => n.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"));
68
ответ дан Rusty Divine 23 May 2017 в 12:09
поделиться

Переопределите метод SaveChanges в вашем контексте:

public override int SaveChanges()
{
  DateTime saveTime = DateTime.UtcNow;
  foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == (EntityState) System.Data.EntityState.Added))
   {
     if (entry.Property("CreatedDate").CurrentValue == null)
       entry.Property("CreatedDate").CurrentValue = saveTime;
    }
    return base.SaveChanges();

}

Обновлено из-за комментариев : только для только что добавленных сущностей будет установлена ​​дата.

28
ответ дан Stephan Keller 23 May 2017 в 12:09
поделиться

Хорошо, поэтому основной проблемой здесь было то, что CreatedDate обновлялся каждый раз, когда я вызывал SaveChanges, и, поскольку я не передавал CreatedDate своим представлениям, он обновлялся до NULL или MinDate с помощью Entity Framework.

Решение было простым, зная, что мне нужно установить CreatedDate только тогда, когда EntityState.Added, я просто установил свой entity.CreatedDate.IsModified = false, прежде чем выполнять какую-либо работу в переопределении SaveChanges, так что я игнорировал изменения из Updates если бы это было Add, CreatedDate был бы установлен несколькими строками позже.

4
ответ дан Brian Ogden 23 May 2017 в 12:09
поделиться

Аналогично Ответу Стефана , но с Отражением , а также игнорирует все пользовательские (внешние) обновления, созданные / обновленные времена. Шоу Гист

  public override int SaveChanges()
        {
            foreach (var entry in ChangeTracker.Entries().Where(x => x.Entity.GetType().GetProperty("CreatedTime") != null))
            {
                if (entry.State == EntityState.Added)
                {
                    entry.Property("CreatedTime").CurrentValue = DateTime.Now;
                }
                else if (entry.State == EntityState.Modified)
                {
                    // Ignore the CreatedTime updates on Modified entities. 
                    entry.Property("CreatedTime").IsModified = false;
                }

                // Always set UpdatedTime. Assuming all entities having CreatedTime property
                // Also have UpdatedTime
                // entry.Property("UpdatedTime").CurrentValue = DateTime.Now;
                // I moved this part to another foreach loop
            }

            foreach (var entry in ChangeTracker.Entries().Where(
                e => 
                    e.Entity.GetType().GetProperty("UpdatedTime") != null && 
                    e.State == EntityState.Modified || 
                    e.State == EntityState.Added))
            {
                entry.Property("UpdatedTime").CurrentValue = DateTime.Now;
            }

            return base.SaveChanges();
        }
4
ответ дан Community 23 May 2017 в 12:09
поделиться

Code First в настоящее время не предоставляет механизм для предоставления значений столбцов по умолчанию.

Вам нужно будет вручную изменить или создать базовый класс для автоматического обновления CreatedDate

public abstract class MyBaseClass
{
    public MyBaseClass()
    {
        CreatedDate = DateTime.Now;
    }
    public Datetime CreatedDate { get; set; }
}
2
ответ дан Aiska Hendra 23 May 2017 в 12:09
поделиться
Accounts account;
account.Acct_JoinDate = DateTime.Now.ToUniversalTime();
data.Accounts.Add(account);
data.SaveChanges();

Почему бы не указать временную метку при создании модели? Подобно этим рассказам здесь.

-1
ответ дан Chazt3n 23 May 2017 в 12:09
поделиться

Для EF Core вы можете найти рекомендуемое MS решение здесь: Значения по умолчанию .

Используйте Fluent API в вашем DBContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Created)
        .HasDefaultValueSql("getdate()");
}
1
ответ дан Laobu 23 May 2017 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: