本文主要是介绍一步一步学习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:
点确认后弹出选择框如下: 点OK,创建应用程序.
下面添加EF CTP5与Unity2.0,在刚建立的项目上右键,选择添加类库包引用,点击左边的online,在搜索框里输入Unity,找到Unity后点install.,安装成功后(图二)它自动把需要的程序集加入到项目中(图三):
然后继续搜索EFCodeFirst并安装:
三,建立领域模型
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>
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(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!