首页 > 解决方案 > 使用接口的抽象属性行为

问题描述

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

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

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

标签: c#entity-frameworkentity-framework-coreef-core-2.1

解决方案


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

推荐阅读