将modelBuilder配置为一次组合多个属性配置

本文关键字:配置 组合 一次 属性 modelBuilder | 更新日期: 2023-09-27 17:57:57

有没有一种方法可以为Required、MaxLength和HasColumn组合多个属性,或者我需要为每个属性创建一个属性?

如果它们不是像我现在所做的那样为实体中的每个字段创建一个新字段,我希望能够包括多个需要的字段,并将它们分类为相同的MaxLength。

public class DataEntryContext : DbContext
{
    public DataEntryContext(DbContextOptions<DataEntryContext> options)
        :base (options)
    { }
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Department> Departments { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>()
            .HasKey(e => e.EmpId);
        modelBuilder.Entity<Employee>()
            .Property(e => e.EmpFirstName)
            .HasColumnType("varchar(50)")
            .HasMaxLength(50)
            .IsRequired();
        modelBuilder.Entity<Employee>()
            .Property(e => e.EmpLastName)
            .HasColumnType("varchar(50)")
            .HasMaxLength(50)
            .IsRequired();
        modelBuilder.Entity<Employee>()
            .Property(e => e.EmpPhoneNumber)
            .HasColumnType("varchar(10)")
            .HasMaxLength(10)
            .IsRequired();
        modelBuilder.Entity<Employee>()
            .Property(e => e.EmpStartDate)
            .HasColumnType("datetime")
            .IsRequired();

        modelBuilder.Entity<Department>()
            .HasKey(d => d.DeptId);
        modelBuilder.Entity<Department>()
            .Property(d => d.DeptName)
            .HasColumnType("varchar(50)")
            .HasMaxLength(50)
            .IsRequired();
    }
}

将modelBuilder配置为一次组合多个属性配置

当然可以,您只需要自己编写代码。例如,我编写了一个EntityTypeConfigurationExtensions,它允许您在单个调用中而不是在多个调用中配置具有多个属性的实体。我不明白为什么你不能修改我的代码以使用params,然后你可以传递多个属性:

(您必须先进行propertyConfiguration,然后进行propertyExpression)

public static class EntityTypeConfigurationExtensions
{
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, byte[]>> propertyExpression,
        Func<BinaryPropertyConfiguration, BinaryPropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, Guid>> propertyExpression,
        Func<PrimitivePropertyConfiguration, PrimitivePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, Guid?>> propertyExpression,
        Func<PrimitivePropertyConfiguration, PrimitivePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, TimeSpan?>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, TimeSpan>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, DateTimeOffset?>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, DateTimeOffset>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, DateTime?>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, DateTime>> propertyExpression,
        Func<DateTimePropertyConfiguration, DateTimePropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, decimal?>> propertyExpression,
        Func<DecimalPropertyConfiguration, DecimalPropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, decimal>> propertyExpression,
        Func<DecimalPropertyConfiguration, DecimalPropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
    public static EntityTypeConfiguration<TEntityType> Property<TEntityType>(
        this EntityTypeConfiguration<TEntityType> instance,
        Expression<Func<TEntityType, string>> propertyExpression,
        Func<StringPropertyConfiguration, StringPropertyConfiguration> propertyConfiguration)
        where TEntityType : class
    {
        propertyConfiguration(instance.Property(propertyExpression));
        return instance;
    }
}

现在这个:

modelBuilder.Entity<Employee>()
  .HasKey(e => e.EmpId);
modelBuilder.Entity<Employee>()
  .Property(e => e.EmpFirstName)
  .HasColumnType("varchar(50)")
  .HasMaxLength(50)
  .IsRequired();
modelBuilder.Entity<Employee>()
  .Property(e => e.EmpLastName)
  .HasColumnType("varchar(50)")
  .HasMaxLength(50)
  .IsRequired();
modelBuilder.Entity<Employee>()
  .Property(e => e.EmpStartDate)
  .HasColumnType("datetime")
  .IsRequired();

现在是:

modelBuilder.Entity<Employee>()
  .HasKey(e => e.EmpId)
  .Property(e => e.EmpFirstName,
    p => p.HasColumnType("varchar(50)")
     .HasMaxLength(50)
     .IsRequired())
  .Property(e => e.EmpLastName,
    p => p.HasColumnType("varchar(50)")
      .HasMaxLength(50)
      .IsRequired())
  .Property(e => e.EmpStartDate,
    p => p.HasColumnType("datetime")
      .IsRequired());

因此,修改我的代码以使用params,并更新plumbing以仅循环通过参数,将产生:

modelBuilder.Entity<Employee>()
  .HasKey(e => e.EmpId)
  .Property(p => p.HasColumnType("varchar(50)")
    .HasMaxLength(50)
    .IsRequired(),
    e => e.EmpFirstName,
    e => e.EmpLastName);
  .Property(p => p.HasColumnType("datetime")
    .IsRequired(),
    e => e.EmpStartDate,);

不,目前还不可能。你必须为每个财产写下它。最多可以强制实体框架将.Net数据类型映射到特定的MSSQL数据类型,如图所示。