Как настроить Automapper для публикации данных в нескольких связанных таблицах? - PullRequest
1 голос
/ 20 января 2020

Я хочу разместить данные в нескольких таблицах, связанных через свойства навигации. Я использую Automapper для этого, однако, я получаю пустую строку всякий раз, когда я отправляю данные, поэтому я думаю, что моя конфигурация или подход могут быть неправильными.

У меня есть три таблицы, которые представлены ViewModel, здесь мой код:

BaseEntity.cs

using System;
using System.ComponentModel.DataAnnotations;

namespace MyProject.Data
{
    public class BaseEntity
    {        
        public int Id { get; set; }
        public string CreatedUser { get; set; }
        public string UpdatedUser { get; set; }
        public string DeletedUser { get; set; }
        public DateTime? CreatedDate { get; set; }
        public DateTime? UpdatedDate { get; set; }
        public DateTime? DeletedDate { get; set; }
    }
}

Car.cs

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;


namespace MyProject.Data
{
    public class Car : BaseEntity
    {
        public string Make { get; set; }
        public string Model { get; set; }
        public string Reg { get; set; }

        public ICollection<Options> Options { get; set; }
        public ICollection<Spec> Spec { get; set; }
    }
}

Опции .cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MyProject.Data
{
    public class Options : BaseEntity
    {
        public bool? Stereo { get; set; }
        public bool? FogLights { get; set; }
        public bool? BikeRack { get; set; }

        public Car Car { get; set; }
    }
}

Spe c .cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MyProject.Data
{
    public class Spec : BaseEntity
    {
        public int? BHP { get; set; }
        public string EngineCode { get; set; }
        public string? Displacement { get; set; }

        public Car Car { get; set; }
    }
}       

ViewModel выглядит следующим образом.

CarViewModel.cs

using Microsoft.AspNetCore.Http;
using System;
using System.ComponentModel.DataAnnotations.Schema;

namespace MyProject.Data.ViewModels
{
    public class VesselViewModel
    {
        //Car
        public int Id { get; set; }
        public string Make { get; set; }
        public string Model { get; set; }
        public string Reg { get; set; }

        //Options
        public bool? Stereo { get; set; }
        public bool? FogLights { get; set; }
        public bool? BikeRack { get; set; }

        //Spec
        public int? BHP { get; set; }
        public string EngineCode { get; set; }
        public string? Displacement { get; set; }    

        //Navigation Property
        public Car Car { get; set; }
    }
}

MappingConfiguration / CarProfile.cs

using AutoMapper;
using MyProject.Data;
using MyProject.Data.ViewModels;

namespace MyProject.UI.MappingConfigurations
{
    public class CarProfile : Profile
    {
        public CarProfile()
        {
            CreateMap<Car, CarViewModel>().ReverseMap();
        }
    }
}

MappingConfiguration / MakeProfile.cs

using AutoMapper;
using MyProject.Data;
using MyProject.Data.ViewModels;

namespace MyProject.UI.MappingConfigurations
{
    public class MakeProfile : Profile
    {
        public OptionsProfile()
        {
            CreateMap<Options, OptionsViewModel>().ReverseMap();
        }
    }
}

MappingConfiguration / SpecProfile.cs

using AutoMapper;
using MyProject.Data;
using MyProject.Data.ViewModels;

namespace MyProject.UI.MappingConfigurations
{
    public class SpecProfile : Profile
    {
        public SpecProfile()
        {
            CreateMap<Spec, CarViewModel>().ReverseMap();
        }
    }
}

Вот мой метод Create, который использует Automapper для всего этого. Как примечание, я использую общий репозиторий c для своей работы с внедрением зависимостей и сервисным уровнем.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CarViewModel car) 
{
    if (ModelState.IsValid)
    {
        var carData = _mapper.Map<Car>(car);
        var optionsData = _mapper.Map<Options>(car);
        var specData = _mapper.Map<Spec>(car);

        _carService.InsertCar(carData);
        _optionsService.InsertOptions(optionsData);
        _specService.InsertSpec(specData);

        return View();
    }
    return View();
}

Форма

Здесь данные представлены, из-за связанных данных, ViewModel используется для пользовательского интерфейса.

Models.VesselViewModel

<form id="carCreateForm" asp-controller="Car" asp-action="Create" method="post" asp-antiforgery="true" enctype="multipart/form-data">
    ...form inputs here.
</form>

При добавлении нового автомобиля соответствующие данные публикуются, но в таблицу «Автомобиль» добавляется пустой «Автомобиль». Что не так с моей конфигурацией? Любая помощь приветствуется.

...