c# - 使用接口的抽象属性行为
问题描述
我有一个 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))
{
??
}
}
解决方案
你快到了。只需用于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;
}
推荐阅读
- html - 如何为表单创建一个真实的数据库?
- java - Java Keccak-256 在零字节消息上实现不正确的哈希
- pug - (Jade/Pug) 在父块上应用 mixin
- lm - R 的 lm 函数中的残差标准误差 (RSE) 是如何计算的?
- python - 是否可以在 colab 上运行更新版本的 Python?
- java - 为什么将计算值存储在 Java 类中是不好的做法,我该如何避免呢?
- mysql - 反向迁移/删除自定义索引名称 laravel 迁移的外键
- html - 使用 Angular 将 div 动态添加到具有相同类的元素
- vb.net - 为什么我在声明我的 PFDAcroForm 时出现异常?
- windows - 尽管没有批处理文件的扩展名,但运行任意文件(例如.vbs 混合脚本文件)就好像它是批处理脚本一样