Entity framework 实体框架核心配置

Entity framework 实体框架核心配置,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,在EF6中,我们可以直接将EntityTypeConfiguration传递给ModelBuilder以构建映射,并将配置类与上下文分开,而不会在代码中过于冗长 他们删除了EF core中的那些地图了吗。有没有一种方法可以在不在ModelBuilder中为每个类添加配置的情况下添加配置?最好的方法是使配置代码远离OnModelCreating方法。因此,您可以执行以下操作: 创建一个类,用于存储实际配置: public class ApplicationUserConfiguration {

在EF6中,我们可以直接将EntityTypeConfiguration传递给ModelBuilder以构建映射,并将配置类与上下文分开,而不会在代码中过于冗长


他们删除了EF core中的那些地图了吗。有没有一种方法可以在不在ModelBuilder中为每个类添加配置的情况下添加配置?

最好的方法是使配置代码远离
OnModelCreating
方法。因此,您可以执行以下操作:

创建一个类,用于存储实际配置:

public class ApplicationUserConfiguration
{
    public ApplicationUserConfiguration(EntityTypeBuilder<ApplicationUser> entity)
    {
        // Here you have all the good stuff
        entity.ToTable("user", "identity");

        entity.Property(p => p.Id)
            .HasColumnName("id);

        // And so on ....
    }
}
是实现目标的干净和简单的方法

有没有一种方法可以不在ModelBuilder中添加配置 每节课

若数据库中有数百个表,并且必须手动配置每个映射类,那个么这肯定是一项额外的工作

在的帮助下,您可以在几行代码中实现所需的结果,如良好的旧EF 6

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    Type[] types = typeof(EntityTypeConfiguration<>).GetTypeInfo().Assembly.GetTypes();
    IEnumerable<Type> typesToRegister = types
        .Where(type => !string.IsNullOrEmpty(type.Namespace) &&
                        type.GetTypeInfo().BaseType != null &&
                        type.GetTypeInfo().BaseType.GetTypeInfo().IsGenericType &&
                        type.GetTypeInfo().BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

    foreach (var type in typesToRegister)
    {
        dynamic configurationInstance = Activator.CreateInstance(type);
        ModelBuilderExtensions.AddConfiguration(modelBuilder, configurationInstance);
    }

    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
Type[]types=typeof(EntityTypeConfiguration).GetTypeInfo().Assembly.GetTypes();
IEnumerable TypeStoreRegister=类型
.Where(type=>!string.IsNullOrEmpty(type.Namespace)&&
type.GetTypeInfo().BaseType!=null&&
type.GetTypeInfo().BaseType.GetTypeInfo().IsGenericType&&
type.GetTypeInfo().BaseType.GetGenericTypeDefinition()==typeof(EntityTypeConfiguration));
foreach(TypeStoreRegister中的变量类型)
{
dynamic configurationInstance=Activator.CreateInstance(类型);
添加配置(modelBuilder,configurationInstance);
}
基于模型创建(modelBuilder);
}
扩展方法
公共抽象类EntityTypeConfiguration,其中tenty:class
{
公共抽象空图(EntityTypeBuilder);
}
公共静态类ModelBuilderExtensions
{
公共静态void AddConfiguration(ModelBuilder ModelBuilder,EntityTypeConfiguration配置)
地点:班级
{
Map(modelBuilder.Entity());
}
}
映射类
公共类用户映射:EntityTypeConfiguration
{
公共覆盖无效映射(EntityTypeBuilder)
{
//主键
HasKey(t=>t.Id);
...
} 
}

EntityFrameworkCore2.0具有一个可用于以下用途的:

class ApplicationUserMap : IEntityTypeConfiguration<ApplicationUser>
{
  public void Configure(EntityTypeBuilder<Customer> builder)
  {
    builder.ToTable("user", "identity");

    builder.Property(p => p.Id)
        .HasColumnName("id");
     ...
   }
}

...
// OnModelCreating
modelBuilder.ApplyConfiguration(new ApplicationUserMap());
class ApplicationUserMap:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商。可转让(“用户”、“身份”);
builder.Property(p=>p.Id)
.姓名(“id”);
...
}
}
...
//关于模型创建
ApplyConfiguration(新的ApplicationUserMap());

做了类似的事情。。。我为每个类创建了一个静态方法Configure(),并传递了builder@Jajan这也是我的第一个想法/尝试。但我希望避免不必要地引用EntityFramework,因为我希望我的“实体”能够跨项目和平台重用。只是我的2 ct;)。你的解决方案和其他任何解决方案一样有效,没有任何问题。
public abstract class EntityTypeConfiguration<TEntity> where TEntity : class
{
    public abstract void Map(EntityTypeBuilder<TEntity> builder);
}

public static class ModelBuilderExtensions
{
    public static void AddConfiguration<TEntity>(ModelBuilder modelBuilder, EntityTypeConfiguration<TEntity> configuration)
        where TEntity : class
    {
        configuration.Map(modelBuilder.Entity<TEntity>());
    }
}
public class UserMap : EntityTypeConfiguration<User>
{
    public override void Map(EntityTypeBuilder<User> builder)
    {
        // Primary Key
        builder.HasKey(t => t.Id);
        ...
    } 
}
class ApplicationUserMap : IEntityTypeConfiguration<ApplicationUser>
{
  public void Configure(EntityTypeBuilder<Customer> builder)
  {
    builder.ToTable("user", "identity");

    builder.Property(p => p.Id)
        .HasColumnName("id");
     ...
   }
}

...
// OnModelCreating
modelBuilder.ApplyConfiguration(new ApplicationUserMap());