从DTO到具有嵌套集合的实体框架的AutoMapper

时间:2017-03-17 03:53:26

标签: entity-framework automapper dto

我有这个型号:

enter image description here

我想添加一个新的Autor,如下所示:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            AutorServiceClient service = new AutorServiceClient();

            LivroContract[] livros = {
                new LivroContract { id_tipo = 1, nome_livro = "Asp.Net MVC 5" },
                new LivroContract { id_tipo = 1, nome_livro = "Asp.Net Entity Framework" }
            };

            AutorContract autorContract = new AutorContract()
            {
                nome_autor = "Novo Autor",
                Livros = livros
            };

            if (service.Add(autorContract))
                Console.WriteLine("Adicionado com Sucesso");
        }
        catch (Exception)
        {
            Console.WriteLine("Erro !!!");
        }
    }
}

我的Autor类有一个嵌套的Livro集合,我想插入一个新的Autor及其各自的Livro实体。

以下是我的数据访问代码的一部分,用于插入:

    public class AutorDA
    {
        private readonly BibliotecaEntities _context;
        private readonly DbSet<Autor> _dbSet;

        public AutorDA()
        {
            _context = new BibliotecaEntities();
            _dbSet = _context.Set<Autor>();

            Mapping();
        }

        public void Mapping()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Autor, AutorDTO>();
                cfg.CreateMap<AutorDTO, Autor>();
                cfg.CreateMap<ICollection<Autor>, IEnumerable<AutorDTO>>();
                cfg.CreateMap<IEnumerable<AutorDTO>, ICollection<Autor>>();

                cfg.CreateMap<Biblioteca, BibliotecaDTO>();
                cfg.CreateMap<BibliotecaDTO, Biblioteca>();
                cfg.CreateMap<ICollection<Biblioteca>, IEnumerable<BibliotecaDTO>>();
                cfg.CreateMap<IEnumerable<BibliotecaDTO>, ICollection<Biblioteca>>();

                cfg.CreateMap<Livro, LivroDTO>();
                cfg.CreateMap<LivroDTO, Livro>();
                cfg.CreateMap<ICollection<Livro>, IEnumerable<LivroDTO>>();
                cfg.CreateMap<IEnumerable<LivroDTO>, ICollection<Livro>>();

                cfg.CreateMap<Tipo_Livro, TipoLivroDTO>();
                cfg.CreateMap<TipoLivroDTO, Tipo_Livro>();
                cfg.CreateMap<ICollection<Tipo_Livro>, IEnumerable<TipoLivroDTO>>();
                cfg.CreateMap<IEnumerable<TipoLivroDTO>, ICollection<Tipo_Livro>>();
            });
        }

        public bool Add(AutorDTO dto)
        {
            try
            {
                Mapping();

                Autor autor = Mapper.Map<Autor>(dto);

                _dbSet.Add(autor);

                _context.SaveChanges();

                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
....

这是我的DTO:

public class AutorDTO
{
    public int id { get; set; }
    public string nome_autor { get; set; }
    public IEnumerable<LivroDTO> Livros { get; set; }
}

public class LivroDTO
{
    public int id { get; set; }
    public int id_tipo { get; set; }
    public string nome_livro { get; set; }
    public ICollection<AutorDTO> Autores { get; set; }
    public ICollection<BibliotecaDTO> Bibliotecas { get; set; }
    public TipoLivroDTO TipoLivro { get; set; }
}

我知道这里有问题,但我不知道是什么......我正在尝试插入Autor和几个Livros实体,但我不知道如何使用AutoMapper和EF。

但是使用此代码,我只插入Autor。

所以,我有两种情况我不知道怎么做:

  • 插入新的Autor和新的Livro实体
  • 插入新的Autor并将其与已插入的Livro实体相关联

我如何将AutoMapper配置为上述两种情况?

最后,我的最后一个问题是:

  • 对于我们有一个主实体的情况,有什么更好的方法,主实体有一个或多个子实体(1:n / n:n)?

  • 插入/更新simultanneosly所有这些实体是一个好主意,还是一个坏主意?如果这是一个坏主意,那么插入主类及其关系的最佳方法是什么?

  • 我们可以看到,我的Livro实体还有其他子关系,但我只想使用Autor和Livro。我需要映射所有模型/实体才能使用这两个模型/实体吗?

感谢。

0 个答案:

没有答案