Использование DateTime.UtcNow в модели всегда создает миграцию в Entity - PullRequest
2 голосов
/ 19 марта 2020

У меня есть несколько моделей, у которых есть свойство CreatedDate и / или updatedDate, и в своем заполнении я устанавливаю их в DateTime.UtcNow.

new TestModel()
{
    Id = 1,
    Name = name,
    CreatedDateUtc = DateTime.UtcNow,
    CreatedBy = "Seed",
    UpdatedDateUtc = DateTime.UtcNow,
    UpdatedBy = "Seed",
    DeletedDateUtc = null,
    DeletedBy = null,
},

Теперь, даже если начальные данные находятся в базе данных, EF считает, что необходимо обновить их с новой датой. Это ожидаемое поведение? Я застрял, указав дату для этих столбцов? Как то так:

DateTime(2020, 01, 01, 12, 00, 00, DateTimeKind.Utc)

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Каждый раз, когда работает начальный метод, он перезаписывает все столбцы, и каждый раз, когда даты отличаются. Если вы хотите предотвратить перезапись введенных данных, то вам нужно проверить, не существует ли она в вашей базе данных, а затем запустить ее. Или переопределите метод SaveChanges() в DbContext, если хотите запретить обновление некоторых полей.

Пример: -

1.Если вы не хотите затем обновить введенные данные -

protected override void Seed(ApplicationDbContext context)
{
    if (!context.TestModels.Any(u => u.Id== 1))
    {
          context.TestModels.AddOrUpdate(p => p.Id, new TestModel()
            {
                Id = 1,
                Name = "Test",
                CreatedDateUtc = DateTime.UtcNow,
                CreatedBy = "Seed",
                UpdatedDateUtc = DateTime.UtcNow,
                UpdatedBy = "Seed",
                DeletedDateUtc = null,
                DeletedBy = null,
            });
    }
 base.Seed(context);
}

2.Если нужно запретить обновление некоторых полей ( этот процесс работает для любой сущности из любой точки текущего DbContext ) -

Атрибут -

[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public sealed class IgnoreUpdateAttribute : Attribute
{
}

Модель -

public class TestModel
{

    public int Id { get; set; }
    public string Name { get; set; }
    [IgnoreUpdate]//for ignoring update
    public DateTime CreatedDateUtc { get; set; }
    [IgnoreUpdate]//for ignoring update
    public string CreatedBy { get; set; }
    public DateTime UpdatedDateUtc { get; set; }
    public string UpdatedBy { get; set; }
    public DateTime? DeletedDateUtc { get; set; }
    public string DeletedBy { get; set; }
}

Семя -

    protected override void Seed(ApplicationDbContext context)
    {

        context.TestModels.AddOrUpdate(p => p.Id, new TestModel()
        {
            Id = 1,
            Name = "Test",
            CreatedDateUtc = DateTime.UtcNow,
            CreatedBy = "Seed",
            UpdatedDateUtc = DateTime.UtcNow,
            UpdatedBy = "Seed",
            DeletedDateUtc = null,
            DeletedBy = null,
        });

        base.Seed(context);
    }

DbContext -

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
        public DbSet<TestModel> TestModels { get; set; }
//---DB Set
        public override int SaveChanges()
        {
           var entities= ChangeTracker.Entries().Where(e => e.State == EntityState.Modified).ToList();
            foreach (var entry in entities)
            {
                var properties = typeof(TestModel).GetProperties()// get you model properties
                        .Where(property =>
                            property != null && Attribute.IsDefined(property, typeof(IgnoreUpdateAttribute)))//which has decorated as IgnoreUpdate
                        .Select(p => p.Name);
                foreach (var property in properties)
                {
                    entry.Property(property).IsModified = false;
                }
            }

            return base.SaveChanges();
        }
//--- Code
    }

(проверено)

0 голосов
/ 04 апреля 2020

Заполнение с помощью HasData, EF будет преобразовывать дату в новую всегда.

На вашем месте я бы использовал предсказуемое и воспроизводимое начальное число с фиксированной датой.

Или, если вам действительно нужно использовать Сейчас, вы можете попробовать ручная миграция и проверяя заранее, запущен ли ваш начальный размер таблицы с некоторыми пользовательскими логами c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...