我每次使用脚手架时都会创建一个新的DbSet

时间:2016-10-20 14:59:53

标签: c# asp.net-mvc automapper asp.net-mvc-scaffolding

当我尝试对我的ViewModel进行脚手架时,我遇到了问题。嗯...首先要做的事情。当我尝试创建我的观点时,我遇到了另一个问题,就是这个问题:

Error

当我尝试使用.Net模板为List / Detail / Etc添加新视图时,就会发生这种情况。

好吧,出现这个错误后,我花了一些时间来解决它。我找到的解决方案之一,就是将我的DbSet更改为IDBSet。嗯......那已经有一段时间了。但是......在我改变我的DbSet之后出现了另一个问题,这次,对于每个使用模板的Scaffolding,都会创建一个新的DbSet。

DbSet autocreated

嗯......我正在研究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 个答案:

答案 0 :(得分:0)

在AutoMapper配置文件中,首先,您应该只有一个构造函数。其次,您只需要在Profile对象中调用基础CreateMap。

不知道您的EF问题,只是想指出AutoMapper中的问题。