Система.Данные.Сущность.ModelConfiguration отсутствует в ядре EF
Попытка динамически загрузить все конфигурации на OnModelCreating for Entity framework core. что же делать, если отсутствует ModelConfiguration?
2 ответа:
Я только что наткнулся на этот вопрос, когда сам искал ответ. Я обнаружил, что это не так (пока?) реализован в ядре EF, но может быть реализован самостоятельно довольно легко.
Вы можете создать один из них:
using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Microsoft.EntityFrameworkCore { public abstract class EntityTypeConfiguration<TEntity> where TEntity : class { public abstract void Map(EntityTypeBuilder<TEntity> modelBuilder); } public static class ModelBuilderExtensions { public static void AddConfiguration<TEntity>(this ModelBuilder modelBuilder, EntityTypeConfiguration<TEntity> configuration) where TEntity : class { configuration.Map(modelBuilder.Entity<TEntity>()); } } }
И затем вы можете создать конфигурацию для самой сущности: -
using Microsoft.EntityFrameworkCore; using Project.Domain.Models; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Project.Persistance.EntityConfigurations { public class MyEntityConfiguration : EntityTypeConfiguration<MyEntity> { public override void Map(EntityTypeBuilder<MyEntity> modelBuilder) { modelBuilder .Property();//config etc } } }
Затем вы можете загрузить все свои конфигурации куда-нибудь (вероятно, есть и лучший способ, и лучшее место для этого... но вот что я сделал): -
using Microsoft.EntityFrameworkCore; using Project.Domain.Models; using Project.Persistance.EntityConfigurations; namespace Project.Persistance { public class MyDbContext : DbContext { // Normal DbContext stuff here protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.AddConfiguration(new MyEntityConfiguration()); } } }
Теперь в Core 2.0 все еще проще
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace MyApp.DAL.EntityConfigurations { public class StudentConfiguration : IEntityTypeConfiguration<Student> { public void Configure(EntityTypeBuilder<Student> modelBuilder) { modelBuilder.Property(f => f.Name).IsRequired(); } } }
Затем в контексте БД:
public DbSet<Student> Students{ get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Customizations must go after base.OnModelCreating(builder) builder.ApplyConfiguration(new StudentConfig()); builder.ApplyConfiguration(new SomeOtherConfig()); // etc. // etc.. }