Леса создают новый DbSet каждый раз, когда я его использую

У меня есть проблема, когда я пытаюсь создать скаффолдинг своей ViewModel. Ну... обо всем по порядку. У меня была другая проблема, когда я пытался создать свои взгляды, это была эта проблема:

ошибка

Это происходит именно тогда, когда я пытаюсь добавить новый вид, используя шаблон.Net для List/Detail/Etc.

Ну, после появления этой ошибки у меня ушло некоторое время, чтобы ее исправить. Одно из решений, которое я нашел, - это изменить мой DbSet на IDBSet. Ну... Это сработало какое-то время. Но... после того, как я изменил свой DbSet, появилась другая проблема, на этот раз для каждого Скаффолдинга, использующего шаблон, создается новый DbSet.

DbSet создан автоматически

Хорошо... Я изучал DDD, мой код будет чуть ниже:

public class ProjetoDeEstudoContexto : DbContext
{
    public ProjetoDeEstudoContexto()
        : base("ProjetoDeEstudoContext")
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ProjetoDeEstudoContexto, Configuration>());
    }

    public DbSet<Estagiario> Estagiarios { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        modelBuilder.Properties<string>().Configure(p => p.HasColumnType("varchar"));
        modelBuilder.Properties<string>().Configure(p => p.HasMaxLength(150));

        //Configuration cria a tabela de acordo com os parametros da classe Config.
        modelBuilder.Configurations.Add(new EstagiarioConfig());
    }
}

public class EstagiarioConfig : EntityTypeConfiguration<Estagiario>
{
    public EstagiarioConfig()
    {
        HasKey(e => e.EstagiarioId);
        Property(n => n.Nome).IsRequired().HasMaxLength(150);
        Property(n => n.Sobrenome).IsRequired().HasMaxLength(150);
    }
}

public class Estagiario
{
    public int EstagiarioId { get; set; }
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
    public DateTime? DataDeInicio { get; set; }
    public DateTime? DataDeTermino { get; set; }
}

public class EstagiarioViewModel
{
    [Key]
    public int EstagiarioId { get; set; }

    [Required(ErrorMessage = "Preencha o campo Nome")]
    [MaxLength(150, ErrorMessage = "Máximo {0} caracteres")]
    [MinLength(2, ErrorMessage = "Minimo {0} caracteres")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "Preencha o campo Nome")]
    [MaxLength(150, ErrorMessage = "Máximo {0} caracteres")]
    [MinLength(2, ErrorMessage = "Minimo {0} caracteres")]
    public string Sobrenome { get; set; }

    [ScaffoldColumn(false)]
    public DateTime? DataDeInicio { get; set; }

    [ScaffoldColumn(false)]
    public DateTime? DataDeTermino { get; set; }
}

Мои классы AutoMapper

public static void RegisterMappings()
{
    Mapper.Initialize(x =>
    {
        x.AddProfile<DomainToViewModelMappingProfile>();
        x.AddProfile<ViewModelToDomainMappingProfile>();
    });
}

public class DomainToViewModelMappingProfile : Profile
{
    private MapperConfiguration mapConfig;
    public override string ProfileName => "DomainToViewModelMapping";

    protected override void Configure()
    {
        mapConfig = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Estagiario, EstagiarioViewModel>();
        });
    }
}

public class ViewModelToDomainMappingProfile : Profile
{
    private MapperConfiguration mapConfig;
    public override string ProfileName => "ViewModelToDomainMapping";
    protected override void Configure()
    {
        mapConfig = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<EstagiarioViewModel,Estagiario>();
        });
    }
}

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AutoMapperConfig.RegisterMappings();
    }
}

Как я могу остановить это автоматическое создание DbSet? Что не так в моем коде?

1 ответ

Во-первых, в ваших профилях AutoMapper у вас должен быть только конструктор. Во-вторых, вам нужно только вызвать базовый CreateMap в объекте Profile.

Не знаю о ваших проблемах EF, просто хотел указать на проблемы в AutoMapper.

Другие вопросы по тегам