一步一步学习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

相关文章

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM