Абстрактное поведение свойства с использованием интерфейса - PullRequest
0 голосов
/ 18 октября 2018

У меня есть интерфейс ITiming:

public interface ITiming
{
    DateTime CreatedAt { get; set; }
    DateTime UpdatedAt { get; set; }
}

И несколько классов, которые его реализуют:

public class Post : ITiming
{
    public int IdPost { get; set; }
    public string Title { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

В моем построителе моделей я устанавливаю AfterSaveBehavior для каждой сущностикоторый реализует ITiming, например:

modelBuilder.Entity<Post>(entity =>
{
    entity.HasKey(e => e.IdPost);

    entity.Property(e => e.CreatedAt)
        .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
});

Как я могу абстрагировать AfterSaveBehaviour для всех сущностей столбцов CreatedAt, которые реализуют ITiming?

            // not sure about this
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                if (typeof(ITiming).IsAssignableFrom(entityType.ClrType))
                {
                    ??
                }
            }

1 Ответ

0 голосов
/ 18 октября 2018

Вы почти у цели.Просто используйте FindProperty, чтобы получить доступ к изменяемым метаданным свойства:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    if (typeof(ITiming).IsAssignableFrom(entityType.ClrType))
    {
        entityType.FindProperty(nameof(ITiming.CreatedAt))
            .AfterSaveBehavior = PropertySaveBehavior.Ignore;
    }
}

В качестве альтернативы вы можете игнорировать интерфейс и применить пользовательское соглашение DateTime CreatedAt:

foreach (var property in modelBuilder.Model.GetEntityTypes()
    .SelectMany(t => t.GetProperties())
    .Where(p => p.ClrType == typeof(DateTime) && p.Name == "CreatedAt"))
{
    property.AfterSaveBehavior = PropertySaveBehavior.Ignore;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...