Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有DB first Entity Framework和AutoMapper的C#控制台应用程序无法将模型转换为DbModel_C#_Entity Framework_Automapper - Fatal编程技术网

带有DB first Entity Framework和AutoMapper的C#控制台应用程序无法将模型转换为DbModel

带有DB first Entity Framework和AutoMapper的C#控制台应用程序无法将模型转换为DbModel,c#,entity-framework,automapper,C#,Entity Framework,Automapper,我试图让一个基本的控制台应用程序工作,这样我就可以使用DB First Entity Framework和AutoMapper将用户输入的数据保存到现有数据库中,但当我试图将本地模型保存回数据库时,我无法编译,因为它无法将本地模型转换为DB模型 EF已生成以下类: //------------------------------------------------------------------------------ // <auto-generated> // Thi

我试图让一个基本的控制台应用程序工作,这样我就可以使用DB First Entity Framework和AutoMapper将用户输入的数据保存到现有数据库中,但当我试图将本地模型保存回数据库时,我无法编译,因为它无法将本地模型转换为DB模型

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; }
    }
}
在我的控制台应用程序中,我使用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();
    }



}
static void Main(字符串[]args)
{
var config=new-MapperConfiguration(cfg=>{
CreateMap().ReverseMap();
});
IMapper mapper=config.CreateMapper();
var source=new DbModels.contact();
var dest=mapper.Map(源);
AppModels.contact ContactDetails=新的AppModels.contact();
Console.WriteLine(“输入您的姓名:”);
ContactDetails.full_name=Console.ReadLine();
Console.WriteLine(“输入您的电子邮件:”);
ContactDetails.email=Console.ReadLine();
Console.WriteLine(“输入您的电话号码:”);
ContactDetails.mobile_phone=Console.ReadLine();
使用(var dbcontext=new myDbContext())
{
dbcontext.contact.Add(mapper.Map(ContactDetails));//参数1:无法从“AppModels.contact”转换为“DbModels.contact”
dbcontext.SaveChanges();
}
}
dbcontext.contact.Add(ContactDetails)行在编译
参数1时抛出错误:无法从'AppModels.contact'转换为'DbModels.contact'
我在web应用程序中使用了几乎相同的automapper/EF代码,并且都正常工作,似乎automapper没有告诉EntityFramework它可以使用模型映射

您的异常状态为“参数1:无法从'AppModels.contact'转换为'DbModels.contact'。”

但是,您的映射是从DbModel版本到AppModel版本。不确定您使用的是哪一版本的AM,但是有一个ReverseMap函数,您可以将它链接到map调用的末尾,并让它以两种方式执行

下面是将其添加到AM的提交。

以下是反向映射方法的文档,供其他人将来参考:

更新:我刚刚注意到您使用的是Map()而不是CreateMap()。AM是一个分为两步的过程…1步创建映射,1步执行映射。您只执行初始化中的第二步,但缺少第一部分。我还更新了下面的示例,因为我刚刚逐字复制了您的代码并添加了反向调用

在(初始化方法)中更改此行:

为此:

var dest = mapper.CreateMap<DbModels.contact, AppModels.contact>(source).ReverseMap();
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 dbcontext=new myDbContext())
{
dbcontext.contact.Add(AM.Map(ContactDetails));//这是伪的……您必须在范围内使用映射程序,正如您的注释中所指出的那样?我认为大多数AM版本中都不需要Src类型。
dbcontext.SaveChanges();
}
下面是它的用法示例:

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

您需要在主方法中创建并使用映射器。在InitialiseAutomapper中创建的内容在该方法运行完成后立即消失。您需要仔细阅读变量上下文。在方法上下文中创建的变量只存在于该上下文中。谢谢,我将所有内容从
InitializeAutomapper()
移到了
main()
的顶部,但我得到了相同的错误,我还尝试重新使用
dest
变量,而不是创建一个新的
AppModels。请联系
,但再次出现相同的错误。显示新代码。使用新代码结构更新op我想你差不多做到了……在调用saveI时仍然需要进行映射我通过NuGet添加了AM(v8.0.0)我尝试将行更改为
var dest=mapper.CreateMap(source.reverseemap()但是得到了一个“CreateMap没有定义”我以为我是在用
IMapper mapper=config.CreateMapper()遵循这两个步骤行。我必须在
Add
中交换源代码和dest,现在它可以工作了:
dbcontext.contact.Add(mapper.Map(ContactDetails))啊,是真的……很抱歉在我等待构建时,我一直在想这个问题……很高兴你让它工作起来了。:)
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();