2016-10-20 9 views
0

ViewModel을 스캐 폴딩하려고 할 때 문제가 있습니다. 음 ... 처음부터. 나는이 목록/상세/기타의 닷넷 템플릿을 사용하여 새보기를 추가 할 때스캐 폴딩은 매번 사용할 새 DbSet을 만듭니다.

Error

그것은 정확히 일 : 나는 내 견해를 만들려고 할 때 또 다른 문제가 있었다,이 문제였다.

음,이 오류가 나타나면 해결을 위해 시간이 걸렸습니다. 내가 찾은 솔루션 중 하나는 IDbet으로 내 DbSet을 변경하는 것입니다. 그게 ... 잠시 동안 일 했어. 하지만 ... 내 DbSet을 변경 한 후에 다른 문제가 나타났습니다. 이번에는 템플릿을 사용하는 각 스캐 폴딩에 대해 새로운 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 클래스 I이 자동 DbSet 생성을 막을 수있는 방법

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(); 
    } 
} 

? 내 코드에서 무엇이 잘못 되었습니까?

+1

생성자에'Database.SetInitializer'가 필요 없습니다. 'public DbSet을 설정하십시오. Estagiarios {get; 세트; }'''public 가상 DbSet Estagiarios {get; 세트; } ' –

+0

글쎄, 나는 당신의 제안을 tryied했지만 여전히 Scaffolding을 사용하여 새로운 View를 만들려고 할 때 나는 똑같은 문제를 겪고있다. :(http://imgur.com/a/Wlr8x –

답변

0

AutoMapper 프로필에서 먼저 생성자 만 있어야합니다. 둘째, Profile 객체에서 기본 CreateMap 만 호출하면됩니다.

EF 문제에 대해 알지 못하지만 AutoMapper의 문제를 지적하고 싶습니다.

+0

팁 Jimmy 주셔서 감사합니다. DDD 아키텍처 때문에 Visual Studio에서 내가하는 일을 이해할 수 있는지 여부를 알 수 없으므로이 EF 문제에 대해 생각하고 있습니다. –