Ima*_*ehi 4 c# onion-architecture entity-framework-core asp.net-core-mvc .net-core
我开始工作,.net core 并Entityframework 7在Onion 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?。为什么我们必须创建映射器!
我的大问题是:我们可以对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
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |