我首先在Entity Framework Core中使用代码和流畅的API来确定属性的行为。
我想知道是否有办法替换这部分。
modelBuilder.Entity<Person>()
.Property(b => b.Name)
.IsRequired();
modelBuilder.Entity<Person>()
.Property(b => b.LastName)
.IsRequired();
modelBuilder.Entity<Person>()
.Property(b => b.Age)
.IsRequired();
有这样的事情:
modelBuilder.Entity<Person>()
.AllProperties()
.IsRequired();
关键是有时大多数属性甚至都需要为NOT NULL。标记每个属性并不优雅。
答案 0 :(得分:4)
解决方案可能是使用反射:
var properties = typeof(Class).GetProperties();
foreach (var prop in properties)
{
modelBuilder.Entity<Class>().Property(prop.PropertyType, prop.Name).IsRequired();
}
请注意,所有属性都将根据需要进行设置。当然,您可以根据类型(例如)过滤要根据需要设置的属性。
<强>更新强>
使用扩展方法可以使其更清晰。
EntityTypeBuilderExtensions.cs
public static class EntityTypeBuilderExtensions
{
public static List<PropertyBuilder> AllProperties<T>(this EntityTypeBuilder<T> builder, Func<PropertyInfo, bool> filter = null) where T : class
{
var properties = typeof(T).GetProperties().AsEnumerable();
if (filter != null) properties = properties.Where(x => filter(x));
return properties.Select(x => builder.Property(x.PropertyType, x.Name)).ToList();
}
}
DbContext
中的用法:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Class>().AllProperties().ForEach(x => x.IsRequired());
}
如果您只想将IsRequired
应用于某个类的特定属性,则可以将过滤器函数传递给AllProperties
方法。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Required is applied only for string properties
modelBuilder.Entity<Class>().AllProperties(x => x.PropertyType == typeof(string)).ForEach(x => x.IsRequired());
}