Если вы только вносили изменения и удаляли файл, но не фиксировали его, а теперь вы расстались с вашими изменениями
git checkout -- .
, но ваши удаленные файлы не возвращались, вы просто выполняете следующую команду :
git checkout <file_path>
И престо, ваш файл вернулся.
Вот как я это сделал:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate{ get; set; }
в методе Up () моей миграции:
AddColumn("Agents", "CreatedDate", n => n.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"));
Переопределите метод 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();
}
Обновлено из-за комментариев : только для только что добавленных сущностей будет установлена дата.
Хорошо, поэтому основной проблемой здесь было то, что CreatedDate обновлялся каждый раз, когда я вызывал SaveChanges, и, поскольку я не передавал CreatedDate своим представлениям, он обновлялся до NULL или MinDate с помощью Entity Framework.
Решение было простым, зная, что мне нужно установить CreatedDate только тогда, когда EntityState.Added, я просто установил свой entity.CreatedDate.IsModified = false, прежде чем выполнять какую-либо работу в переопределении SaveChanges, так что я игнорировал изменения из Updates если бы это было Add, CreatedDate был бы установлен несколькими строками позже.
Аналогично Ответу Стефана , но с Отражением , а также игнорирует все пользовательские (внешние) обновления, созданные / обновленные времена. Шоу Гист
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();
}
Code First в настоящее время не предоставляет механизм для предоставления значений столбцов по умолчанию.
Вам нужно будет вручную изменить или создать базовый класс для автоматического обновления CreatedDate
public abstract class MyBaseClass
{
public MyBaseClass()
{
CreatedDate = DateTime.Now;
}
public Datetime CreatedDate { get; set; }
}
Accounts account;
account.Acct_JoinDate = DateTime.Now.ToUniversalTime();
data.Accounts.Add(account);
data.SaveChanges();
Почему бы не указать временную метку при создании модели? Подобно этим рассказам здесь.
Для EF Core вы можете найти рекомендуемое MS решение здесь: Значения по умолчанию .
Используйте Fluent API в вашем DBContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()");
}