• EntityFramework简介

ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表,最新版本Entity Framework 4.1已经发部。Entity Framework 是要用于技术人员通过面向概念性应用程序模型开发基于数据库访问的应用程序,从而彻底改变以前哪咱面向关系性数据存储架构开发程序的情况。主要的目标是降低数据访问应用程序的开发难度,减少应用程序代码量,从而减少程序出错的可能。

Entity Framework 优势:

    1. 整个应用程序开发的过程中技术人员都在围绕概念性程序模型开发程序代码,使程序员可以更加关注程序的业务模型。
    2. 减少应用程序开发的代码量,使程序更加简洁。
    3. 应用程序开发过程中,不再会对某种存储架构进行硬编码依赖。
    4. 语言集成,数据查询中集成Linq查询,使不懂SQL的程序员也可以轻松开发。

当然Entity Framework优势还有很多,我在此就不一一列举了,有兴趣的朋友可以官网自行学习一下。

  • 使用EntityFramework

新建应用程序工程,如图:

单点Add,添加实体模型,如图:

选择对应的数据库连接后,单击”Next”进行下一步设置,如图:

钩选数据库中对应的数据表,用以生成应用程序模型类,单击”Finish”完成设置。

到此Entity Framework在Database First模式下的设置就搞定了。

  • EntityFramework+Mvc3架构设计

EntityFramework4.1学习有段时间了,前几天静下心来想一想用EntityFramework4.1开发企业级应用程序的架构建,如下架构是我认为可行的开发架构,在此希望朋友们给于指点。

   

企业级应用程序架构解释:

BJCration.EF.Domain
应用程序概念性模型,用于封装数据库生成的实体模型,以整个应用程序提供开发依据。当然这里的模型都是系统生成的,无需手工改动。ObjectContextFactory,是对像上下文工厂类。
所有的对像操作都须通过工厂来进行,针对数据对像的访问权限做了限制。

对像上下文工厂
 1     public static  class ObjectContextFactory
 2     {
 3         static Entities dbContext = null;
 4         public static Entities CreateInstance()
 5         {
 6             if (dbContext == null)
 7                 dbContext = new Entities();
 8             return dbContext;
 9         }
10         public static void SaveChanges(Action<Entities> saveAction)
11         {
12             Entities _db = CreateInstance();
13             saveAction(_db);
14             _db.SaveChanges();
15         }
16     }


ExtendPerson,是人员模型的扩展类。
每一个模型都要对应一个扩展类,用于封装对像的业务逻辑行为,这样所有的模型在应用程序开发过程中就变成了充血模型。

人员扩展类
 1     public static class ExtendPerson
 2     {
 3         public static void SavePerson(this PERSON person)
 4         {
 5             ObjectContextFactory.SaveChanges(dbContext => dbContext.People.AddObject(person));
 6         }
 7         public static void DeletePerson(this PERSON person)
 8         {
 9             ObjectContextFactory.SaveChanges(dbContext =>
10             {
11                 var tempPersons = dbContext.People.Where(p => p.ID == person.ID);
12                 if (tempPersons.Count() > 0)
13                     dbContext.People.DeleteObject(tempPersons.First());
14             });
15         }
16         public static void DeletePersons(this IEnumerable<PERSON> persons)
17         {
18             ObjectContextFactory.SaveChanges(dbContext =>
19             {
20                 foreach (var item in persons)
21                 {
22                     dbContext.People.DeleteObject(item);
23                 }
24             });
25         }
26     }


BJCration.EF.IBLL
业务逻辑控制接口层,主要用于对应用程序中各种对像通信,协作,互交,提供接口。

    public interface IPersonService
    {
        IEnumerable<PERSON> GetAllPerson();
        void DeletePersons(IEnumerable<PERSON> psersons);
    }


BJCration.EF.BLL
业务逻辑控制接口实现层

View Code
 1     public class PersonServiceImpl : IPersonService
 2     {
 3         private static readonly Entities _objectContext = ObjectContextFactory.CreateInstance();
 4         public IEnumerable<PERSON> GetAllPerson()
 5         {
 6             return (IEnumerable<PERSON>)_objectContext.People;
 7         }
 8         public void DeletePersons(IEnumerable<PERSON> psersons)
 9         {
10             psersons.DeletePersons();
11         }
12     }

TestProjectDomain
数据模型测试层。
DataFirstWebApp 视图表示层
Controllers控制层

Controllers
 1 public class HomeController : Controller
 2     {
 3         //
 4         // GET: /Home/
 5         internal IPersonService personService = new PersonServiceImpl();
 6         public ActionResult Index()
 7         {
 8             ViewBag.WorkList = from item in ObjectContextFactory.CreateInstance().WORKINFOes
 9                                select new SelectListItem()
10                                {
11                                    Text = item.WORKNAME,
12                                    Value = item.ID
13                                };
14             return View();
15         }
16         [HttpPost]
17         public ActionResult Index(PERSON person)
18         {
19             person.SavePerson();
20             return RedirectToAction("PersonListView");
21         }
22         public ActionResult PersonListView()
23         {
24             return View(personService.GetAllPerson());
25         }
26         public ActionResult Edit(string id)
27         {
28             var person = ObjectContextFactory.CreateInstance().People.Where(item => item.ID == id);
29             if (person.Count() > 0)
30             {
31                 ViewBag.WorkList = from item in ObjectContextFactory.CreateInstance().WORKINFOes
32                                    select new SelectListItem()
33                                    {
34                                        Text = item.WORKNAME,
35                                        Value = item.ID
36                                    };
37                 return View("Index", person.First());
38             }
39             return RedirectToAction("Index");
40         }
41         public ActionResult Delete(string id)
42         {
43             var person = ObjectContextFactory.CreateInstance().People.Where(item => item.ID == id);
44             person.DeletePersons();
45             return View("PersonListView", ObjectContextFactory.CreateInstance().People);
46         }

View视图层

View Code
@model BJCration.EF.Domain.PERSON
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>公司员工信息</legend>
        <div class="editor-label">
            编号:
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ID)
        </div>
        <div class="editor-label">
            名称:
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.NAME)
        </div>
        <div class="editor-label">
            成绩:
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.GRADE)
        </div>
        <div class="editor-label">
            工作:
        </div>
        <div class="editor-field">
            @Html.DropDownList("workList", (IEnumerable<SelectListItem>)ViewBag.WorkList)
        </div>
        <p>
            <input type="submit" value="保 存" />
             <input type="button" value="列 表"  onclick="javascript:location='@Url.Content("~/Home/PersonListView")'"/>
        </p>
    </fieldset>
}

 

  • EntityFramework感想

     通过这段时间对EntityFramework的学习,我个人感觉EF还不是很成熟,在开发过程中会时不时地出现很多摸明其妙的异常,因为EF对数据模型高度封装,这就会使数据模型与数据访问都高度偶合在一起,如果你想修改事比登天。当然OCP原则提倡我们程序不要修改。但数据模型的扩展性也极差,其优势大概就在于微软提供了全面高效的数据生成工具。
      为此我建议在大型项目中还是少用EF,因为到今天微软还没有给我们把EF搞完善。技术的选择直接影响项目的进度,更会决定以后的代码开发是享受还是煎熬,请各们架构师们三思。