搞清楚这一点有些麻烦.似乎原始设计很容易遵循,但在没有静态Api的新设计中,有很多方法可以实现这一点.我找不到任何可以理解的方式.大量的开始完成视频和教程,但使用我不知道的代码语法.
我刚刚开始创建一个新的应用程序,并希望从一开始就实现它.
有人可以通过以下起点给出一个如何从头开始实现这个的详细示例吗?我意识到这个例子非常简单,不需要使用automapper
使用MVC w / Code First& EF
模型示例
public class Person
{
public int id { get; set; }
public string name { get; set; }
public DateTime created { get;set;
}
ViewModel示例
public class User
{
public string name { get; set; }
}
控制器示例 – (有点粗糙:))
using AutoMapper;
......
[HttpPost]
public ActionResult AddUser(User user)
{
Person person = new Person();
person.name = user.name;
person.created = DateTime.Now;
db.Persons.Add(person);
db.SaveChanges();
return RedirectToAction("Index");
}
我只想将此示例中的名称字段从ViewModel映射到Model.
在我发现的例子中,我特别困惑的一些观点.
在这个网站上> https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
>这段代码在哪里?我是否为每种类型制作其中一种
类型映射?
Mapper.Initialize(cfg => cfg.CreateMap< Order,OrderDto>());
Mapper.Initialize(cfg => cfg.CreateMap< User,Person>()); //这是我在控制器和Global.asax中所做的,它是无效的
>这是Action结果中的部分吗?是
上面“我的例子”中的“用户”“订单”?
OrderDto dto = Mapper.Map< OrderDto>(order);
>它还提到“我在哪里配置AutoMapper”
在关于互联网的例子中,它演示了在Global.asax中创建一个单一引用到一个页面我应该创建名为“whateverIWant”的具有个人档案的页面?我猜我把“初始化代码(我在上面提到过)”放在“Application_Start()”中的Global.asax中?
是吗?有没有办法审核我的类型的映射,这在哪里完成?即字符串操作.等等..
该视频> https://www.youtube.com/watch?v=-5sZ7hq3J10在2:46失去了我,我还没有使用过存储库,也不确定它们是什么.我认为这是他审核映射,但它是希腊语给我.
感谢任何人清除我的大脑所有混合信息我试图从过多的代码样式和版本更改中学习这一点!
更新
到目前为止我的过程……
>将一个类添加到我的App_Start文件夹中.我把它命名为MappingConfig.cs
>通过从MappingConfig.cs代码中删除“.App_Start”来更正名称空间.
>在MappingConfig类的内部创建一个用于初始化地图的方法.
我的方法看起来像这样:
public static void RegisterMaps()
{
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap< User,Person>());
}
编辑:我的方法内部是初始化.初始化只需要做一次吗?如果是这样我在哪里映射其他类型.我在一些代码示例中看过“profile”但没有解释它是什么. github网站也没有解释它的用途.
>在您的控制器内部 – ActionResult,您可以通过执行以下操作进行映射:
var person = Mapper.Map< Person>(user);
编辑:最后一行代码返回“缺少类型映射配置或不支持的映射”.
>现在调用“Application_Start()”里面的Global.asax中的类和方法,其中路由和bunde配置是在程序开始时初始化地图.我在底部添加了这样的:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
MappingConfig.RegisterMaps(); // 就在这儿
}
我相信这是我需要做的全部实现吗?仍在努力拦截正在映射的数据,因此我可以对其进行操作并对其进行测试以确定我是否正确执行.
解决方法:
首先,您应该转到Glabal.asax来配置映射.请执行下列操作:
Mapper.Initialize(config =>
{
config.CreateMap<User, Person>().ReverseMap();
});
ReverseMap()意味着您要在两个方向上进行映射.
这将导致从User到Person的映射名称属性.
在你的Conrtoller中使用Mapper类中的静态实例进行映射,如下所示:
User userViewModel = Mapper.Map<User>(person);
Mapper.Map将使用您的配置在这两种类型之间进行映射.