在EF7中使用dbset和mappers有什么区别

Ima*_*ehi 4 c# onion-architecture entity-framework-core asp.net-core-mvc .net-core

我开始工作,.net coreEntityframework 7Onion Architecture!我阅读了教程,我认为这是学习以下主题的最佳案例。但是本教程的一部分在我的脑海中提出了一个大问题。就像您在此链接页面上看到的一样;在数据层,我们有一些类是我们的模型!

public class User : BaseEntity
{
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public virtual UserProfile UserProfile { get; set; }
}

public class UserProfile : BaseEntity
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public virtual User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还有一些类映射到这样的模型上面!

public class UserProfileMap
{
    public UserProfileMap(EntityTypeBuilder<UserProfile> entityBuilder)
    {
        entityBuilder.HasKey(t => t.Id);
        entityBuilder.Property(t => t.FirstName).IsRequired();
        entityBuilder.Property(t => t.LastName).IsRequired();
        entityBuilder.Property(t => t.Address);
    }
}

public class UserMap
{
    public UserMap(EntityTypeBuilder<User> entityBuilder)
    {
        entityBuilder.HasKey(t => t.Id);
        entityBuilder.Property(t => t.Email).IsRequired();
        entityBuilder.Property(t => t.Password).IsRequired();
        entityBuilder.Property(t => t.Email).IsRequired();
        entityBuilder.HasOne(t => t.UserProfile).WithOne(u => u.User).HasForeignKey<UserProfile>(x => x.Id);
    }
}
Run Code Online (Sandbox Code Playgroud)

DbContext在数据库的表中创建以下模型的OnModelCreating方法中使用此映射器类:

public class ApplicationContext : DbContext
{
    public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        new UserMap(modelBuilder.Entity<User>());
        new UserProfileMap(modelBuilder.Entity<UserProfile>());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的大问题是:我们可以DbSet<>对db上下文中的每个实体使用,而避免编写mapper并在中的OnModelCreating方法实例化它们dbcontext。为什么本教程没有使用dbset?。为什么我们必须创建映射器!

Win*_*Win 5

我的大问题是:我们可以对db上下文中的每个实体使用DbSet <>,并且避免编写映射器并在dbcontext的OnModelCreating方法中实例化它们。为什么本教程没有使用dbset?。为什么我们必须创建映射器!

new UserMap(modelBuilder.Entity<User>());基本上是使用Fluent API将EF实体配置和映射到DbSet的EF Core方法。

db上下文中每个实体的DbSet <>以及使用Mapper配置DbSet的方法都是相同的。

在Entity Framework 6中,我们使用EntityTypeConfiguration并创建像这样的映射类。与Data Annotation相比,它非常干净,并且遵循单一职责原则

美丽之处在于,我们只需要以下代码即可使用反射自动配置数百个实体。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   ...
   var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
        .Where(type => !string.IsNullOrEmpty(type.Namespace) &&
             type.BaseType != null &&
             type.BaseType.IsGenericType &&
             type.BaseType.GetGenericTypeDefinition() == typeof (EntityTypeConfiguration<>));

   foreach (var type in typesToRegister)
   {
      dynamic configurationInstance = Activator.CreateInstance(type);
      modelBuilder.Configurations.Add(configurationInstance);
   }

   base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)

另外,我们可以使用Entity Framework Power Tools,并从现有数据库创建实体和映射配置。只需花费几分钟,便可以将数百个表生成类。对我们来说,这节省了很多时间。

不幸的是,到目前为止,EF Core中还不EntityTypeConfiguration<T>提供该功能。我认为我们很多人仍然喜欢将旧方法与新方法结合使用,以将Mapping配置保留在外部,尽管我们在EF6中所做的工作并不那么顺利。EntityTypeBuilder<T>DbContext