Консольное приложение C # с базой данных Entity Framework и AutoMapper, не может конвертировать модель в DbModel - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь заставить основное консольное приложение работать так, чтобы я мог сохранить введенные пользователем данные в существующую базу данных, используя DB First Entity Framework и AutoMapper, но когда я пытаюсь сохранить свою локальную модель обратно в базу данных, я не могу скомпилировать, потому что он не может преобразовать локальную модель в модель БД.

EF сгенерировал следующий класс:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace DbModels
{
    using System;
    using System.Collections.Generic;

    public partial class contact
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public contact()
        {
            this.address = new HashSet<address>();
        }

        public System.Guid id { get; set; }
        public string full_name { get; set; }
        public string email { get; set; }
        public string mobile_phone { get; set; }
        public System.DateTime created_timestamp { get; set; }
        public System.DateTime modified_time_stamp { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<address> address { get; set; }
    }
}

У меня тогда есть локальная contact модель:

using System;
namespace AppModels
{
    public class contact
    {
        public contact()
        {
            id = new Guid();
            created_timestamp = DateTime.Now;
            modified_time_stamp = DateTime.Now;
        }
        public Guid id { get; }
        public string full_name { get; set; }
        public string email { get; set; }
        public string mobile_phone { get; set; }
        public DateTime created_timestamp { get; }
        public DateTime modified_time_stamp { get; }

    }
}

В своем консольном приложении я использую AutoMapper, чтобы создать карту между моделями, получить некоторый пользовательский ввод и попытаться сохранить этот ввод в базе данных:

static void Main(string[] args)
{
    var config = new MapperConfiguration(cfg => {
        cfg.CreateMap<DbModels.contact, AppModels.contact>().ReverseMap();
    });

    IMapper mapper = config.CreateMapper();
    var source = new DbModels.contact();
    var dest = mapper.Map<DbModels.contact, AppModels.contact>(source);

    AppModels.contact ContactDetails = new AppModels.contact();
    Console.WriteLine("Enter your name:");
    ContactDetails.full_name = Console.ReadLine();

    Console.WriteLine("Enter your email:");
    ContactDetails.email = Console.ReadLine();

    Console.WriteLine("Enter your phone number:");
    ContactDetails.mobile_phone = Console.ReadLine();

    using (var dbcontext = new myDbContext())
    {
        dbcontext.contact.Add(mapper.Map<DbModels.contact,AppModels.contact>(ContactDetails)); // Argument 1: cannot convert from 'AppModels.contact' to 'DbModels.contact' 
        dbcontext.SaveChanges();
    }



}

Строка dbcontext.contact.Add(ContactDetails); выдает ошибку при компиляции Argument 1: cannot convert from 'AppModels.contact' to 'DbModels.contact' Я использовал почти тот же код Autopper / EF в веб-приложении, и все это работало, кажется, что AutoMapper не сообщает EntityFramework, что существует отображение модели это можно использовать.

1 Ответ

0 голосов
/ 22 января 2019

Ваше исключение гласит: «Аргумент 1: невозможно преобразовать из« AppModels.contact »в« DbModels.contact »».

Ваше отображение из версии DbModel в версию AppModel. Не уверен, какую версию AM вы используете, но есть функция ReverseMap, которую вы можете связать до конца вызова карты и сделать так, чтобы она выполнялась обоими способами.

Вот коммит, где он был добавлен в AM. https://github.com/AutoMapper/AutoMapper/commit/bff6e2aa49af3e7b50f527376da48924efa7d81e

Для дальнейшего использования, вот документ к методу ReverseMap: http://docs.automapper.org/en/stable/Reverse-Mapping-and-Unflattening.html

ОБНОВЛЕНИЕ: Я только что заметил, что вы используете Map () вместо CreateMap (). AM - двухэтапный процесс ... 1, чтобы создать карту, и 1, чтобы сделать отображение. Вы делаете только второй шаг в инициализации, но пропускаете первую часть. Я также обновил приведенный ниже пример, так как только что скопировал ваш код дословно и добавил обратный вызов.

Изменить эту строку в (метод Initialize):

var dest = mapper.Map<DbModels.contact, AppModels.contact>(source);

К этому:

var dest = mapper.CreateMap<DbModels.contact, AppModels.contact>(source).ReverseMap();

Затем измените это в вашем сохранении:

using (var dbcontext = new myDbContext())
    {
        dbcontext.contact.Add(ContactDetails); // Argument 1: cannot convert from 'AppModels.contact' to 'DbModels.contact' 
        dbcontext.SaveChanges();
    }

На это:

using (var dbcontext = new myDbContext())
    {
        dbcontext.contact.Add(AM.Map<Src, Dest>(ContactDetails)); // This is pseudo...you have to have the mapper in scope as was pointed out in the comments of your ? and I don't think the Src type is required in most versions of AM.
        dbcontext.SaveChanges();
    }

Вот пример его использования:

var dest = mapper.CreateMap<DbModels.contact, AppModels.contact>(source).ReverseMap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...