zoukankan      html  css  js  c++  java
  • 在MVC应用程序中使用自动程序进行CRUD操作

    下载sample app - 2.53 MB 下载old app - 2.33 MB 下载database script - 1 KB 下载Sql Script for Table - 0.7 KB 下载PDF - 922.6 KB 介绍 在我们学习MVC的系列文章中,我们学习了很多关于MVC的知识,关于在MVC应用程序中与数据库通信的各种技术,以及一些内部概念。 当我们沉浸在实时编程环境中时,我们在代码中面临的不仅仅是一种,而是多种类型的挑战。本文介绍了MVC应用程序中的自动映射器这一新概念,以克服我们在与数据实体通信并将它们绑定到模型时所面临的主要挑战之一。 挑战 有时在与实时(数据库)实体交互并将我们的模型绑定到它们时,我们会遇到这样的情况: 隐藏,复制Codevar dbContext = new MyDBDataContext(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); var user = new LearningMVC.Models.User(); if (userDetails != null) { user.UserId = userDetails.UserId; user.FirstName = userDetails.FirstName; user.LastName = userDetails.LastName; user.Address = userDetails.Address; user.PhoneNo = userDetails.PhoneNo; user.EMail = userDetails.EMail; user.Company = userDetails.Company; user.Designation = userDetails.Designation; } return View(user); 上面提到的代码并不难理解。在上面的代码中,一个实例变量dbContext = new MyDBDataContext();从LINQ to SQL上下文类创建,然后获取用户详细信息。从用户特定的表中,并存储在var userDetails变量中。我们有一个名为User的现有模型(LearningMVC.Models.User()),它具有与从数据库生成的Users类相似的属性。现在我们从数据库中User类的实例的属性来初始化模型实例的属性,这样我们就可以在MVC应用程序中填充视图。 我们在这里可以看到,有8个属性彼此相似,但每个属性集都位于单独的类中,一个在模型中,一个在Users类中。我们一个接一个地将这些属性绑定到模型并传递给视图。现在的问题是,如果我们有来自数据库的100列记录,而我们的模型有相同数量的属性,并且在不同的场景中代码需要重复6-7次呢?现在,我们是否仍然遵循将每个属性从数据库绑定到模型的策略呢?相信我,代码将有100页那么大,而且仅仅将模型与领域实体绑定起来就要花费5倍的精力。 为了克服这种冗长的情况,引入了自动装置。它不仅减少了工作量,而且还限制了执行大量行所花费的执行时间。 自动映射器 AutoMapper是GitHub中提供的一个开源库。 根据CodePlex网页上的描述:“AutoMapper是一个对象-对象映射器。对象-对象映射的工作原理是将一种类型的输入对象转换为另一种类型的输出对象。使AutoMapper有趣的是,它提供了一些有趣的约定,来解决如何将类型A映射到类型B的棘手工作。只要类型B遵循AutoMapper建立的约定,那么映射两种类型几乎不需要任何配置。”因此,它为我们的映射问题提供了解决方案。 安装AutoMapper 首先在你的Visual Studio IDE中安装NuGet包管理器。完成后,去: 工具→图书馆包管理器->包管理器控制台 然后在Visual Studio底部打开的控制台窗口中,键入: PM>安装包AutoMapper 按回车,这将安装AutoMapper,下次在Visual Studio中打开MVC应用程序时,它将自动为项目添加一个DLL引用。 AutoMapper在行动 让我们先创建一个MVC应用程序。您可以创建一个MVC应用程序,并使用LINQ to SQL将其与数据库连接起来,以下是我的文章:  http://www.codeproject.com/articles/620197/learing-mvc-part2-creating-mvc-applications & p  我还附上了一个没有自动程序使用的现有MVC应用程序的代码。现在让我们逐个评估控制器的所有动作,并使用AutoMapper转换代码。 步骤1:为现有的应用程序创建一个数据库,数据库脚本附有源代码: 在Visual Studio中打开现有的MVC应用程序: 看到AutoMapper在项目中被引用了,现在在MyController中使用这个名称空间,如下: 第二步:索引操作: 在控制器MyController(在Controllers文件夹下找到)的第一个操作索引操作中,我们看到代码: 隐藏,复制Codepublic ActionResult Index() { var dbContext = new MyDBDataContext(); var userList = from user in dbContext.Users select user; var users = new List<LearningMVC.Models.User>(); if (userList.Any()) { foreach (var user in userList) { users.Add(new LearningMVC.Models.User() { UserId = user.UserId, Address = user.Address, Company = user.Company, FirstName = user.FirstName, LastName = user.LastName, Designation = user.Designation, EMail = user.EMail, PhoneNo = user.PhoneNo }); } } return View(users); } 那么,AutoMapper在这里适合做什么呢?您知道它将用于替换代码中逐一完成的属性映射,因此,在第一行代码中,定义一个自动映射。要创建默认映射,调用适当类型的映射程序. createmap<T1, T2>()。在这种情况下,T1将学习mvc。User和t2将学习mvc . models .User。 隐藏,复制CodeMapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>(); LearningMVC。用户→DTO对象类学习mvc . models。用户→模型类来绑定视图 因此,在这里,我们在AutoMapper类的帮助下定义DTO和模型类之间的映射。 现在在foreach循环中,将整个代码替换为: 隐藏,复制CodeLearningMVC.Models.User userModel = Mapper.Map<LearningMVC.User, LearningMVC.Models.User>(user); users.Add(userModel); 最后调用映射器。maper . map&t1, T2>(obj1)获取T2的映射对象。 所以,我们最后的动作代码: 隐藏,复制Codepublic ActionResult Index() { Mapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>(); var dbContext = new MyDBDataContext(); var userList = from user in dbContext.Users select user; var users = new List<LearningMVC.Models.User>(); if (userList.Any()) { foreach (var user in userList) { LearningMVC.Models.User userModel = Mapper.Map<LearningMVC.User, LearningMVC.Models.User>(user); users.Add(userModel); } } return View(users); } 我们的年代现在,我们摆脱了逐一匹配属性的枯燥工作。现在运行应用程序,您将看到应用程序像以前一样运行。 步骤3:详细说明行动: 现有的代码 隐藏,复制Codepublic ActionResult Details(int? id) { var dbContext = new MyDBDataContext(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); var user = new LearningMVC.Models.User(); if (userDetails != null) { user.UserId = userDetails.UserId; user.FirstName = userDetails.FirstName; user.LastName = userDetails.LastName; user.Address = userDetails.Address;        user.PhoneNo = userDetails.PhoneNo; user.EMail = userDetails.EMail; user.Company = userDetails.Company; user.Designation = userDetails.Designation; } return View(user); } 新代码与自动程序 隐藏,复制Codepublic ActionResult Details(int? id) { var dbContext = new MyDBDataContext(); Mapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); LearningMVC.Models.User user = Mapper.Map<LearningMVC.User, LearningMVC.Models.User>(userDetails); return View(user); } 步骤4:创建Action (POST) 现有的代码: 隐藏,收缩,复制Code[HttpPost] public ActionResult Create(LearningMVC.Models.User userDetails) { try { var dbContext = new MyDBDataContext(); var user = new User(); if (userDetails != null)        { user.UserId = userDetails.UserId; user.FirstName = userDetails.FirstName; user.LastName = userDetails.LastName; user.Address = userDetails.Address;  user.PhoneNo = userDetails.PhoneNo; user.EMail = userDetails.EMail; user.Company = userDetails.Company; user.Designation = userDetails.Designation; } dbContext.Users.InsertOnSubmit(user); dbContext.SubmitChanges(); return RedirectToAction("Index"); } catch { return View(); } } 新代码与自动程序: 隐藏,复制Code[HttpPost] public ActionResult Create(LearningMVC.Models.User userDetails) { try { Mapper.CreateMap<LearningMVC.Models.User, LearningMVC.User>(); var dbContext = new MyDBDataContext();         var user = Mapper.Map<LearningMVC.Models.User, LearningMVC.User>(userDetails); dbContext.Users.InsertOnSubmit(user); dbContext.SubmitChanges(); return RedirectToAction("Index"); }     catch { return View(); } } 注意,在这里我们交换了映射,因为现在我们必须从模型中读取数据并绑定到DTO以创建操作,所以只需交换映射并运行应用程序。T1是模型,T2是DTO。 第五步:编辑动作: 现有的代码 隐藏,复制Codepublic ActionResult Edit(int? id) { var dbContext = new MyDBDataContext(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); var user = new LearningMVC.Models.User(); if (userDetails != null) { user.UserId = userDetails.UserId; user.FirstName = userDetails.FirstName; user.LastName = userDetails.LastName; user.Address = userDetails.Address; user.PhoneNo = userDetails.PhoneNo; user.EMail = userDetails.EMail; user.Company = userDetails.Company; user.Designation = userDetails.Designation; } return View(user); } 新代码与自动程序 隐藏,复制Codepublic ActionResult Edit(int? id) { Mapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>(); var dbContext = new MyDBDataContext(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); var user = Mapper.Map<LearningMVC.User, LearningMVC.Models.User>(userDetails) return View(user); } 第六步:删除操作: 现有的代码 隐藏,复制Codepublic ActionResult Delete(int? id) { var dbContext = new MyDBDataContext(); var user = new LearningMVC.Models.User(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); if (userDetails != null) { user.FirstName = userDetails.FirstName; user.LastName = userDetails.LastName; user.Address = userDetails.Address; user.PhoneNo = userDetails.PhoneNo; user.EMail = userDetails.EMail; user.Company = userDetails.Company; user.Designation = userDetails.Designation; }   return View(user); } 使用自动程序的新代码 隐藏,复制Codepublic ActionResult Delete(int? id) { var dbContext = new MyDBDataContext(); Mapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>(); var userDetails = dbContext.Users.FirstOrDefault(userId => userId.UserId == id); var user = Mapper.Map<LearningMVC.User, LearningMVC.Models.User>(userDetails); return View(user); } ForMember()和MapFrom() AutoMapper中的两个重要功能在对象映射中起着重要的作用。假设我们的model/viewmodel类有一个属性FullName,我们想要在DTO中添加用户的名和姓,使其成为一个全名,并将其绑定到模型。对于这些类型的场景,ForMember()和MapFrom()就派上用场了。看下面的代码: 隐藏,复制CodeMapper.CreateMap<LearningMVC.User, LearningMVC.Models.User>().ForMember(emp => emp.Fullname, map => map.MapFrom(p => p.FirstName + " " + p.LastName)); 这里我们说的是ForMember FullName在我们的模型类中映射用户DTO的姓和名属性。 代码本身是不言而喻的。这种映射也称为自定义映射。 结论 在本文中,我们学习了如何在AutoMapper的帮助下进行自定义映射和实体到实体的映射。由于这只是概念的一个一瞥,在这个主题中有更多的细节探索。 我已经跳过了POST的编辑和删除方法,这将是你的一种作业。一旦你完全遵循并理解了这一点,你也可以很容易地完成这两个悬而未决的操作。 本文于2013年10月29日在微软网站http://www.asp.net/community/articles[^]上被选为当日最佳文章。 , 编码快乐! 本文转载于:http://www.diyabc.com/frontweb/news420.html

  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/Dincat/p/13449769.html
Copyright © 2011-2022 走看看