一步一步学习ASP.NET MVC3 EF Code First CTP 5DI(一)

2024-02-28 19:48

本文主要是介绍一步一步学习ASP.NET MVC3 EF Code First CTP 5DI(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,摘要

本篇文章我们将使用ASP.NET MVC3,Razor,EF Code First创建Web应用程序.覆盖Unity2.0,泛型Repository以及EF Code First的工作单元.需要使用到的工具如下:

1.ASP.NET MVC 3
2.EF Code First CTP5
3.Unity2.0

二,安装工具

安装好Visual Studio2010后继续安装MVC3(http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d2928bc1-f48c-4e95-a064-2a455a22c8f6),NuGet(http://nuget.codeplex.com/)

三,建立程序

1.打开Visual Studio2010选择选择新建ASP.NET MVC 3 Web Application,取名叫MVC3DIApplication:
1

点确认后弹出选择框如下:
2 点OK,创建应用程序.

下面添加EF CTP5与Unity2.0,在刚建立的项目上右键,选择添加类库包引用,点击左边的online,在搜索框里输入Unity,找到Unity后点install.,安装成功后(图二)它自动把需要的程序集加入到项目中(图三):
3

4

5

然后继续搜索EFCodeFirst并安装:
6

三,建立领域模型

1.添加一个类库,命名MVC3DIApplication.Domain,然后在里面添加文件夹Entities,在文件夹里添加实体模型类
Category.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.ComponentModel.DataAnnotations;
   6:  
   7: namespace MyFinance.Domain
   8: {
   9:     public class Category 
  10:     {
  11:  
  12:         public int CategoryId { get; set; }
  13:  
  14:         [Required(ErrorMessage = "Name Required")]
  15:         [StringLength(25, ErrorMessage = "Must be less than 25 characters")]
  16:         public string Name { get; set;}
  17:         public string Description { get; set; }
  18:         public virtual ICollectionExpenses { get; set; }
  19:     }
  20: }

Expense.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace MVC3DIApplication.Domain.Entities
   7: {
   8:     public class Expense
   9:     {
  10:         public int ExpenseId { get; set; }
  11:         public string Transaction { get; set; }
  12:         public DateTime Date { get; set; }
  13:         public double Amount { get; set; }
  14:         public int CategoryId { get; set; }
  15:         public virtual Category Category { get; set; }
  16:     }
  17: }


2.继续添加类库MVC3DIApplication.Data,在其下新建一个叫MyFinanceContext的类,该类继承自DbContext,用来映射我们的模型到数据库表

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Data.Entity;
   6: using MVC3DIApplication.Domain.Entities;
   7:  
   8: namespace MVC3DIApplication.Data
   9: {
  10:     public class MyFinanceContext : DbContext
  11:     {
  12:         public MyFinanceContext() : base("MyFinance") { }
  13:         public DbSetCategories { get; set; }
  14:         public DbSetExpenses { get; set; }
  15:         public virtual void Commit()
  16:         {
  17:             base.SaveChanges();
  18:         }
  19:     }
  20: }

3.修改Web.comfig:

   1: <connectionStrings>
   2:       <add name="MyFinance" connectionString="data source=./MSSQLSERVER2008;Initial Catalog=MVC3DI;Persist Security Info=True;User ID=sa;Password=suzhi921;" providerName="System.Data.SqlClient" />
   3:       <add name="ApplicationServices" connectionString="data source=./SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
   4:     connectionStrings>

四,建立泛型Repository

MVC3DIApplication.Data类库下建立Infrastructure文件夹,在里面添加类IRepository.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace MVC3DIApplication.Data.Infrastructure
   7: {
   8:     public interface IRepositorywhere T : class
   9:     {
  10:         void Add(T entity);
  11:         void Delete(T entity);
  12:         void Delete(Funcpredicate);
  13:         T GetById(long Id);
  14:         T Get(Funcwhere);
  15:         IEnumerableGetAll();
  16:         IEnumerableGetMany(Funcbool> where);
  17:     }
  18: }

IDatabaseFactory.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace MVC3DIApplication.Data.Infrastructure
   7: {
   8:     public interface IDatabaseFactory : IDisposable
   9:     {
  10:         MyFinanceContext Get();
  11:     }
  12: }

RepositoryBase.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Data.Entity;
   6:  
   7: namespace MVC3DIApplication.Data.Infrastructure
   8: {
   9:     public abstract class RepositoryBasewhere T : class
  10:     {
  11:         private MyFinanceContext dataContext;
  12:         private readonly IDbSetdbset;
  13:         protected RepositoryBase(IDatabaseFactory databaseFactory)
  14:         {
  15:             DatabaseFactory = databaseFactory;
  16:             dbset = DataContext.Set();
  17:         }
  18:  
  19:         protected IDatabaseFactory DatabaseFactory
  20:         {
  21:             get;
  22:             private set;
  23:         }
  24:  
  25:         protected MyFinanceContext DataContext
  26:         {
  27:             get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
  28:         }
  29:         public virtual void Add(T entity)
  30:         {
  31:             dbset.Add(entity);
  32:         }
  33:  
  34:         public virtual void Delete(T entity)
  35:         {
  36:             dbset.Remove(entity);
  37:         }
  38:         public void Delete(Funcwhere)
  39:         {
  40:             IEnumerableobjects = dbset.Where(where).AsEnumerable();
  41:             foreach (T obj in objects)
  42:                 dbset.Remove(obj);
  43:         }
  44:         public virtual T GetById(long id)
  45:         {
  46:             return dbset.Find(id);
  47:         }
  48:  
  49:         public virtual IEnumerableGetAll()
  50:         {
  51:             return dbset.ToList();
  52:         }
  53:         public virtual IEnumerableGetMany(Funcbool> where)
  54:         {
  55:             return dbset.Where(where).ToList();
  56:         }
  57:         public T Get(Funcwhere)
  58:         {
  59:             return dbset.Where(where).FirstOrDefault();
  60:         }
  61:     }
  62: }

五,工作单元

工作单元主要用来维护受Business transaction影响的对象以及并发等问题
MVC3DIApplication.Data类库的Infrastructure下建立IUnitOfWork.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace MVC3DIApplication.Data.Infrastructure
   7: {
   8:     public interface IUnitOfWork
   9:     {
  10:         void Commit();
  11:     }
  12: }

UnitOfWork.cs:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace MVC3DIApplication.Data.Infrastructure
   7: {
   8:     public class UnitOfWork : IUnitOfWork
   9:     {
  10:         private readonly IDatabaseFactory databaseFactory;
  11:         private MyFinanceContext dataContext;
  12:  
  13:         public UnitOfWork(IDatabaseFactory databaseFactory)
  14:         {
  15:             this.databaseFactory = databaseFactory;
  16:         }
  17:  
  18:         protected MyFinanceContext DataContext
  19:         {
  20:             get { return dataContext ?? (dataContext = databaseFactory.Get()); }
  21:         }
  22:  
  23:         public void Commit()
  24:         {
  25:             DataContext.Commit();
  26:         }
  27:     }
  28: }

六,Category Repository

MVC3DIApplication.Data类库的下建立Repositories文件夹,里面存储我们的Repositories,下面简历CategoryRepository:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using MVC3DIApplication.Data.Infrastructure;
   6: using MVC3DIApplication.Domain.Entities;
   7:  
   8: namespace MVC3DIApplication.Data.Repositories
   9: {
  10:     public class CategoryRepository : RepositoryBase, ICategoryRepository
  11:     {
  12:         public CategoryRepository(IDatabaseFactory databaseFactory)
  13:             : base(databaseFactory)
  14:         {
  15:         }
  16:     }
  17:     public interface ICategoryRepository : IRepository
  18:     {
  19:     }
  20: }

如果我们有额外的方法,那么我们能定义在上面的Repository里.

七,使用Unity2.0

我们为Unity创建一个自定义的生命周期管理器去存储当前上下文的容器,同时创建控制器工厂

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using Microsoft.Practices.Unity;
   6: using System.Web.Mvc;
   7: using System.Web.Routing;
   8:  
   9: namespace MVC3DIApplication.IoC
  10: {
  11:     public class UnityControllerFactory : DefaultControllerFactory
  12:     {
  13:         IUnityContainer container;
  14:         public UnityControllerFactory(IUnityContainer container)
  15:         {
  16:             this.container = container;
  17:         }
  18:         protected override IController GetControllerInstance(RequestContext reqContext, Type controllerType)
  19:         {
  20:             IController controller;
  21:             if (controllerType == null)
  22:                 throw new HttpException(
  23:                         404, String.Format(
  24:                             "The controller for path '{0}' could not be found" +
  25:             "or it does not implement IController.",
  26:                         reqContext.HttpContext.Request.Path));
  27:  
  28:             if (!typeof(IController).IsAssignableFrom(controllerType))
  29:                 throw new ArgumentException(
  30:                         string.Format(
  31:                             "Type requested is not a controller: {0}",
  32:                             controllerType.Name),
  33:                             "controllerType");
  34:             try
  35:             {
  36:                 //controller = MvcUnityContainer.Container.Resolve(controllerType)
  37:                 //                as IController;
  38:                 controller = container.Resolve(controllerType) as IController;
  39:             }
  40:             catch (Exception ex)
  41:             {
  42:                 throw new InvalidOperationException(String.Format(
  43:                                         "Error resolving controller {0}",
  44:                                         controllerType.Name), ex);
  45:             }
  46:             return controller;
  47:         }
  48:  
  49:     }
  50:     public class HttpContextLifetimeManager: LifetimeManager, IDisposable
  51:     {
  52:         public override object GetValue()
  53:         {
  54:             return HttpContext.Current.Items[typeof(T).AssemblyQualifiedName];
  55:         }
  56:         public override void RemoveValue()
  57:         {
  58:             HttpContext.Current.Items.Remove(typeof(T).AssemblyQualifiedName);
  59:         }
  60:         public override void SetValue(object newValue)
  61:         {
  62:             HttpContext.Current.Items[typeof(T).AssemblyQualifiedName] = newValue;
  63:         }
  64:         public void Dispose()
  65:         {
  66:             RemoveValue();
  67:         }
  68:     }
  69: }

配置Unity:

   1: protected void Application_Start()
   2:        {
   3:            AreaRegistration.RegisterAllAreas();
   4:            RegisterGlobalFilters(GlobalFilters.Filters);
   5:            RegisterRoutes(RouteTable.Routes);
   6:            IUnityContainer container = GetUnityContainer();
   7:            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
   8:        }
   9:  
  10:        private IUnityContainer GetUnityContainer()
  11:        {
  12:            //Create UnityContainer          
  13:            IUnityContainer container = new UnityContainer()
  14:            .RegisterType(new HttpContextLifetimeManager())
  15:            .RegisterType(new HttpContextLifetimeManager())
  16:            .RegisterType(new HttpContextLifetimeManager());
  17:            return container;
  18:        }

八,建立控制器

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.Mvc;
   6: using MyFinance.Data;
   7: using MyFinance.Data.Infrastructure;
   8: using MyFinance.Domain;
   9: using MyFinance.Helpers;
  10: using MyFinance.Service;
  11: namespace MyFinance.Web.Controllers
  12: {
  13:   
  14: public class CategoryController : Controller
  15: {
  16:     private readonly ICategoryRepository categoryRepository;
  17:     private readonly IUnitOfWork unitOfWork;
  18:  
  19:         public CategoryController(ICategoryRepository categoryRepository, IUnitOfWork unitOfWork)
  20:     {
  21:      this.categoryRepository = categoryRepository;
  22:         this.unitOfWork = unitOfWork;
  23:     }  
  24:     public ActionResult Index()
  25:     {
  26:         var categories = categoryRepository.GetAll();
  27:         return View(categories);
  28:     }
  29:     [HttpGet]
  30:     public ActionResult Edit(int id)
  31:     {
  32:         var category = categoryRepository.GetById(id);
  33:         return View(category);
  34:     }
  35:  
  36:     [HttpPost]
  37:     public ActionResult Edit(int id, FormCollection collection)
  38:     {
  39:         var category = categoryRepository.GetById(id);
  40:         if (TryUpdateModel(category))
  41:         {
  42:             unitOfWork.Commit();
  43:             return RedirectToAction("Index");
  44:         }
  45:         else return View(category);            
  46:     } 
  47:  
  48:     [HttpGet]
  49:     public ActionResult Create()
  50:     {
  51:         var category = new Category();
  52:         return View(category);
  53:     }
  54:      
  55:     [HttpPost]
  56:     public ActionResult Create(Category category)
  57:     {
  58:         if (!ModelState.IsValid)
  59:         {
  60:             return View("Create", category);
  61:         }            
  62:         categoryRepository.Add(category); 
  63:         unitOfWork.Commit();
  64:         return RedirectToAction("Index");
  65:     }
  66:  
  67:     [HttpPost]
  68:     public ActionResult Delete(int  id)
  69:    {
  70:         var category = categoryRepository.GetById(id);
  71:         categoryRepository.Delete(category);
  72:         unitOfWork.Commit();
  73:        var categories = categoryRepository.GetAll();
  74:        return PartialView("CategoryList", categories);
  75:  
  76:     }       
  77: }
  78: }

九,建立视图

CategoryList.cshtml:

   1: @using MVC3DIApplication.Domain.Entities;
   2: @model IEnumerable<Category>   
   3:   <table>
   4:         <tr> 
   5:         <th>Actionsth>
   6:         <th>Nameth>
   7:          <th>Descriptionth>
   8:         tr>
   9:     @foreach (var item in Model) {    
  10:         <tr>
  11:             <td>
  12:                 @Html.ActionLink("Edit", "Edit",new { id = item.CategoryId })
  13:                 @Ajax.ActionLink("Delete", "Delete", new { id = item.CategoryId },
  14:                 new AjaxOptions { Confirm = "Delete Expense?", HttpMethod = "Post", 
  15:                     UpdateTargetId = "divCategoryList" })              
  16:             td>
  17:             <td>
  18:                 @item.Name
  19:             td>
  20:             <td>
  21:                 @item.Description
  22:             td>
  23:         tr>
  24:     
  25:     }
  26:  
  27:     table>
  28:     <p>
  29:         @Html.ActionLink("Create New", "Create")
  30:     p>
Index.cshtml:
   1: @model IEnumerable<MVC3DIApplication.Domain.Entities.Category>
   2: @{
   3:     ViewBag.Title = "Index";
   4: }
   5: <h2>Category Listh2>   
   6: <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript">script>   
   7:    <div id="divCategoryList">          
   8:     @Html.Partial("CategoryList", Model)
   9: div>

Create.cshtml:

   1: @model MVC3DIApplication.Domain.Entities.Category
   2:  
   3: @{
   4:     ViewBag.Title = "Create";
   5: }
   6:  
   7: <h2>Createh2>
   8:  
   9: <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">script>
   1:  
   2: 

这篇关于一步一步学习ASP.NET MVC3 EF Code First CTP 5DI(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756439

相关文章

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]