gpt4 book ai didi

c# - Entity Framework 代码中所有属性的必需规则优先

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:17 24 4
gpt4 key购买 nike

我在 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。而且标记每个属性并不优雅。

最佳答案

一个解决方案可能是使用反射:

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(filter);
}

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());
}

关于c# - Entity Framework 代码中所有属性的必需规则优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48278372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com