使用接口的抽象 属性 行为

Abstract property behaviour using interface

我有一个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; }
}

在我的模型构建器中,我为每个实现 ITiming 的实体设置 AfterSaveBehavior,如下所示:

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

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

如何为实现 ITiming 的所有实体 CreatedAt 列抽象 AfterSaveBehaviour?

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

你快到了。只需使用 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;
}