非淡泊无以明志,非宁静无以致远。这篇文章主要讲述C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel相关的知识,希望能为你提供帮助。
我试图让一个基本的控制台应用程序工作,以便我可以使用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;
}
}
}
然后我有一个当地的
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'
时抛出错误我在Web应用程序中使用了几乎相同的automapper / EF代码并且一切正常,似乎AutoMapper并没有告诉EntityFramework它可以使用的模型映射。答案您的异常指出“参数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进行映射。您只是在初始化中执行第二步,但缺少第一部分。我还更新了下面的示例,因为我刚刚逐字复制了您的代码并添加了反向调用。
在(初始化方法)中更改此行:
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();
}
【C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel】以下是它的用法示例:
var dest = mapper.CreateMap<
DbModels.contact, AppModels.contact>
(source).ReverseMap();
推荐阅读
- 为什么我的Qt应用程序会忽略applicationDisplayName的设置()
- Web应用程序的客户端与服务器端与预渲染
- 如何构建用于开发的Raspberry Pi服务器
- 挖掘用于前端开发的ClojureScript
- Redux状态管理的顶级控制(ClojureScript教程)
- F#教程(如何构建完整的F#应用程序)
- 作为JS开发人员,这就是让我彻夜难眠的原因
- ActiveResource.js(快速为你的JSON API构建强大的JavaScript SDK)
- React教程(如何入门及其比较(1))