8
  1. 这是我目前正在做的事情:

    modelBuilder.Entity<Product>().Property(e => e.Name).IsRequired();                   
    modelBuilder.Entity<Product>().Property(e => e.UPC).IsRequired();      
    modelBuilder.Entity<Product>().Property(e => e.Price).IsRequired();      
    modelBuilder.Entity<Product>().Property(e => e.Description).IsRequired();
    
  2. 这是我想做的事情:

    modelBuilder.Entity<Product>()
        .Property(e => e.Name).IsRequired()
        .Property(e => e.UPC).IsRequired()
        .Property(e => e.Price).IsRequired()
        .Property(e => e.Description).IsRequired()
    

但是,后者不起作用。有没有另一种方法不必modelBuilder.Entity<Product>()每次都重复?

  1. 这是当前最简洁的选项:

    var e = modelBuilder.Entity<Product>();
    e.Property(e => e.Name).IsRequired();                   
    e.Property(e => e.UPC).IsRequired();      
    e.Property(e => e.Price).IsRequired();      
    e.Property(e => e.Description).IsRequired();
    
4

4 回答 4

6

这与所有现有的 DbModelBuilder 扩展方法兼容,因为它只是在顶部添加了一个流畅的层,但它确实带来了一些语法开销。不完全符合您的要求,但不涉及使用支持代码。尚未对此进行全面测试,但如果您对语法感到满意,它应该可以工作:

// First option - like this better because it has less cruft than multiple Has invocations

var modelBuilder = new DbModelBuilder();
var modelConfiguration = new ModelConfigurator(modelBuilder);

modelConfiguration.Entity<Product>().Has(e => {
                                         e.Property(en => en.Name).IsRequired();
                                         e.Property(en => en.UPC).IsRequired();
                                         e.Property(en => en.Price).IsRequired();
                                         e.Property(en => en.Description).IsRequired();}
                                        );           

或者

var modelBuilder = new DbModelBuilder();
var modelConfiguration = new ModelConfigurator(modelBuilder);
modelConfiguration.Entity<Product>().Has(e => e.Property(en => en.Name).IsRequired())
                                    .Has(e => e.Property(en => en.UPC).IsRequired())
                                    .Has(e => e.Property(en => en.Price).IsRequired())
                                    .Has(e => e.Property(en => en.Description).IsRequired());

// continue configuring properties, and creating methods on ModelConfigurator as needed

支持代码:

  public class Product{
        public string Name {get;set;}
        public double Price {get;set;}
        public string UPC {get;set;}
        public string Description {get;set;}

    }

    public class ModelConfigurator{

        public DbModelBuilder ModelBuilder{get;set;}

        public ModelConfigurator(DbModelBuilder modelBuilder){
            ModelBuilder = modelBuilder;
        }

        public EntityConfigurator<TEntity> Entity<TEntity>() where TEntity : class {
            var entity = ModelBuilder.Entity<TEntity>();
            return new EntityConfigurator<TEntity>(entity);
        }
    }

    public class EntityConfigurator<TEntity> where TEntity : class{

        public EntityTypeConfiguration<TEntity> EntityTypeConfiguration {get;set;}

        public EntityConfigurator(EntityTypeConfiguration<TEntity> entityTypeConfiguration){
            EntityTypeConfiguration = entityTypeConfiguration;
        }

        public EntityConfigurator<TEntity> Has(Action<EntityTypeConfiguration<TEntity>> a){
            a(this.EntityTypeConfiguration);
            return this;
        }
    }
于 2013-08-25T03:07:57.393 回答
3

另一种选择,在 Entity() 之上不需要 Has():

modelConfiguration.Entity<Product>(e => {
                                   e.Property(en => en.Name).IsRequired();
                                   e.Property(en => en.UPC).IsRequired();
                                   e.Property(en => en.Price).IsRequired();
                                   e.Property(en => en.Description).IsRequired();}
                                  );

扩展方法:

public static EntityTypeConfiguration<TEntity> Entity<TEntity>(this DbModelBuilder modelBuilder, Action<EntityTypeConfiguration<TEntity>> action) where TEntity : class
{
    var r = modelBuilder.Entity<TEntity>();
    action(r);
    return r;
}
于 2014-03-25T12:39:01.620 回答
0

我想您可以执行以下操作,尽管我认为这很尴尬。

public static class EntityConfigExtensions
{
    public static EntityTypeConfiguration<TEntity> Prop<TEntity, TProp>(this EntityTypeConfiguration<TEntity> self, Expression<Func<TEntity, TProp>> propExpression) where TEntity : class
    {
        self.Property(propExpression);
        return self;
    }
    public static EntityTypeConfiguration<TEntity> RequiredProp<TEntity, TProp>(this EntityTypeConfiguration<TEntity> self, Expression<Func<TEntity, TProp>> propExpression) where TEntity : class
    {
        self.Property(propExpression).IsRequired();
        return self;
    }
    // etcetera for other frequently used configs
    // ...
    // And, borrowing from David: a catch-all for the rest
    public static EntityTypeConfiguration<TEntity> Configure<TEntity, TProp>(this EntityTypeConfiguration<TEntity> self, Action<EntityTypeConfiguration<TEntity>> configAction) where TEntity : class
    {
        configAction(self);
        return self;
    }
}

用法:

modelBuilder.Entity<Product>()
    .Prop(e => e.Name)
    .RequiredProp(e => e.UPC)
    .RequiredProp(e => e.Price)
    .Configure(x => x.Ignore(e => e.Description));
于 2013-08-25T02:18:28.683 回答
0

我改编了 jnm2对 EF Core 的回答:

public static class ModelBuilderExtensions
{
    public static EntityTypeBuilder<T> Entity<T>(
        this ModelBuilder modelBuilder,
        Action<EntityTypeBuilder<T>> action) where T : class
    {
        var e = modelBuilder.Entity<T>();
        action(e);
        return e;
    }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>(b =>
    {
        b.Property(e => e.Name).IsRequired();
        b.Property(e => e.UPC).IsRequired();
        b.Property(e => e.Price).IsRequired();
        b.Property(e => e.Description).IsRequired();}
    });
}
于 2021-11-11T17:21:28.317 回答