Ошибка при создании записи с помощью Automapper - PullRequest
0 голосов
/ 08 июля 2020

Я использую Visual Studio 2019, NET Core 3.1. Я пытаюсь создать CRUD с помощью Autoapper. При создании действия я получаю сообщение об ошибке. Я пробовал несколько форм, но ни одна из них не работает.

Ошибка:

The entity type 'CustomerCountriesDto' was not found. Ensure that the entity type has been added to the model.

В представлении:

@model ManufacturaMVC.Models.CustomerCountries

Контроллер:

private readonly ApplicationDbContext _context;
private readonly IMapper _mapper;
    
public CustomerCountriesController(ApplicationDbContext context, IMapper mapper)
{
    _context = context;
    _mapper = mapper;
}

public async Task<IActionResult> Create([Bind("CustomerCountries")] CustomerCountries customerCountries)
{
    if (ModelState.IsValid)
    {
        //var model = _mapper.Map<CustomerCountriesDto>(customerCountries);
        var user = _mapper.Map<CustomerCountries, CustomerCountriesDto>(customerCountries);
        _context.Add(user);
        await _context.SaveChangesAsync();                
        return RedirectToAction(nameof(Index));
    }
}

Ошибка:

Missing type map configuration or unsupported mapping.

Контроллер:

public async Task<IActionResult> Create([Bind("CustomerCountriesDto")] CustomerCountries customerCountries)
{
    if (ModelState.IsValid)
    {
        var model = _mapper.Map<CustomerCountriesDto>(customerCountries);
        var user = _mapper.Map<CustomerCountriesDto, CustomerCountries>(customerCountries);
        _context.Add(user);
        await _context.SaveChangesAsync();                
        return RedirectToAction(nameof(Index));
    }
    return View(customerCountries);          
}

Просмотр:

@model ManufacturaMVC.ViewModels.CustomerCountriesDto

Ошибка:

The entity type 'CustomerCountriesDto' was not found

Просмотр:

@model ManufacturaMVC.Models.CustomerCountries

Контроллер:

    public async Task<IActionResult> Create([Bind("CustomerCountriesDto")] CustomerCountries customerCountries)
{
    if (ModelState.IsValid)
    {
        var model = _mapper.Map<CustomerCountriesDto>(customerCountries);
        //var user = _mapper.Map<CustomerCountries, CustomerCountriesDto>(customerCountries);
        _context.Add(model);
        await _context.SaveChangesAsync();                
        return RedirectToAction(nameof(Index));
    }
    return View(customerCountries);          
}

Модели:

public class CustomerCountries
{
    [StringLength(50, ErrorMessage = "Longitud máxima para el país: 50")]
    public string CustomerCountry { get; set; }
    
    public ICollection<CustomerRegions> CustomerRegions { get; set; }
}

DTO:

public class CustomerCountriesDto
{
    public string CustomerCountry { get; set; }
}

Профиль сопоставления:

public class AutoMapping : Profile
{
    public AutoMapping()
    {
        CreateMap<CustomerCountries, CustomerCountriesDto>(); 
    }
}

DbContext:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    
    }
    
    public DbSet<Categories> Categories { get; set; }
    public DbSet<CustomerCities> CustomerCities { get; set; }
    public DbSet<CustomerCountries> CustomerCountries { get; set; }
    
    // More code ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Categories>().HasKey(m => m.CategoryId);
        modelBuilder.Entity<CustomerCities>().HasKey(m => m.CustomerCity);
        modelBuilder.Entity<CustomerCountries>().HasKey(m => m.CustomerCountry);
    }
}

Может кто-нибудь подскажите пожалуйста, как правильно или что не так?

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Если вы программируете методом проб и ошибок, не совсем понимаете, что делаете, или просто рассчитываете на расположение нескольких строк кода в правильном порядке ... это не путь к go. Это признаки того, что вам нужно расширить свои знания, прочитав некоторую документацию, следуя инструкциям или go вернувшись туда, где все было более понятно. Если вы этого не сделаете, вы будете просто очень неэффективно тратить свое время и расстраиваться еще больше, потому что не понимаете того, с чем имеете дело. Шаг за шагом! Метод проб и ошибок редко может привести к хорошему результату, и даже тогда, как правило, так оно и есть, это почти никогда не является хорошим решением сложных проблем.

Судя по вашему вопросу, вы не только не знаете, что следует отображать , но также и то, что следует добавить в DbContext. Это самые основы CRUD, поэтому вместо того, чтобы просто дать вам ответ на тарелке и причинить вам этим вред, я направлю вас к некоторым показаниям, после чего вы должны выяснить это самостоятельно. Я знаю, что это сайт вопросов и ответов, но на этот раз не могу.

Показания:

Создание CRUD в ASP. NET Core:

https://docs.microsoft.com/aspnet/core/data/ef-mvc/crud?view=aspnetcore-3.1

Добавление новой сущности в DbContext:

https://docs.microsoft.com/ef/core/saving/basic#adding -data

Начало работы с AutoMapper в ASP. NET Ядро:

https://code-maze.com/automapper-net-core/

1 голос
/ 09 июля 2020

Я думаю, вам не хватает сопоставления Dto с классом, у вас есть класс Dto.

public class AutoMapping : Profile
{
    public AutoMapping()
    {
        CreateMap<CustomerCountries, CustomerCountriesDto>(); 
        //add this
        CreateMap<CustomerCountriesDto, CustomerCountries>();
    }
}

Edit : Также обнаружено, что вы можете добавить .ReverseMap() в отображение. Это должно охватывать отображение наоборот.

public class AutoMapping : Profile
{
    public AutoMapping()
    {
        CreateMap<CustomerCountries, CustomerCountriesDto>().ReverseMap();       
    }
}
0 голосов
/ 09 июля 2020

Вопрос - вы регистрировали Профиль в MapperConfiguration? Например:

var config = new MapperConfiguration(cfg =>
{
   cfg.AddProfile<AutoMapping>();
});

Затем вы можете использовать это в своем примере DI, Ninject ниже.

Bind<IMapper>().ToMethod(ctx =>
    new Mapper(config, type => ctx.Kernel.Get(type)));
...