使用接口的抽象 属性 行为
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;
}
我有一个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;
}