1. 现阶段使用回溯

  entityframework作为.net平台自己的一个orm的框架,之前在项目中也有使用,主要采用了table和model first的方式,此两种感觉使用上也是大同小异。在项目中经常反应的一个问题源于多个开发团队共享一个数据库(3个开发团队使用同一个数据库,开发的是一个平台的各个业务场景),因而如在开发库(且记为19)A Team的 Lee 同学,修改了某表的字段,开发过程中 B Team某业务的项目使用EF架构,开发同学 Yang 在开发库上更新了整个table到model的映射,之后继续使用linq方式进行业务处理,一切没有问题,之后开发结束,提交代码构建到beta环境提交测试(测试环境并未A B Team共享,此为B Team的测试环境)此时因为A Team的 Lee 同学的脚本实际上是没有在beta数据库执行的,而程序已经更新过了,这样子就产生程序出错。实际上这理应属于管理问题,具体是sql脚本的管理规范,所以针对多团队的协作使用同一DB的情况下需要约定要么一个人负责DB的权限,或者共享一个sql script的脚本目录,任何数据库脚本,需即时更新进去,在构建或者发布动作保证同时对sql script进行execute(目前在trunk建立了sql script的共享目录以供此操作)。

  2. 使用table first的方式创建演示项目

  1)  创建演示数据库 EFTableModel,并创建演示对象。  

 use EFTableModel
go
create table Users(
id int primary key,
username nvarchar(40)
)
go
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Users_view')
DROP VIEW Users_view
GO
CREATE VIEW Users_view
AS
SELECT * FROM Users
GO
SELECT * FROM Users_view
go
create proc proc_users
as
select * from Users_view
go
exec proc_users

  2)  创建演示项目,并建立table first 的基本映射模型

  新建web项目,使用framework4.5

  选择mvc,并设置 无身份验证

  

  新建 ado.net 实体数据模型

  选择从table生成,即为table first模式

  设置连接数据库

  选择映射模型的包含对象

  如下,即为现下 table first 映射出的 model

  3. 添加 mvc5 controller,进行数据库操作。

  

  

  默认controller已经生成如下的示例代码:  

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using EFTableModelApplication.Models; namespace EFTableModelApplication.Controllers
{
public class UserController : Controller
{
private EFTableModelEntities db = new EFTableModelEntities(); // GET: /User/
public ActionResult Index()
{
return View(db.Users.ToList());
} // GET: /User/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Users.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
} // GET: /User/Create
public ActionResult Create()
{
return View();
} // POST: /User/Create
// 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关
// 详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=317598。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="id,username")] Users users)
{
if (ModelState.IsValid)
{
db.Users.Add(users);
db.SaveChanges();
return RedirectToAction("Index");
} return View(users);
} // GET: /User/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Users.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
} // POST: /User/Edit/5
// 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关
// 详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=317598。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="id,username")] Users users)
{
if (ModelState.IsValid)
{
db.Entry(users).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(users);
} // GET: /User/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Users.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
} // POST: /User/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Users users = db.Users.Find(id);
db.Users.Remove(users);
db.SaveChanges();
return RedirectToAction("Index");
} protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}

  可以看到,至此没有手工书写任何代码层面的东西,完全自动集成,就可以使用EFTableModelEntities对象实例直接操作各个数据表。

  最后访问,http://localhost:63790/user,已经内置了基本crud操作。

  3. 使用 table first 方式 从数据库 更新 model

   首先执行以下脚本,即增加User表一个salary字段:  

 use EFTableModel
alter table Users add salary money
go

  在设计界面,右键,选择 从数据库更新模型,进行数据模型的更新。

  

  更新结束之后,结果如下图所示:

    

  修改index视图:

  

  代码:  

 @model IEnumerable<EFTableModelApplication.Models.Users>

 @{
ViewBag.Title = "Index";
} <h2>Index</h2> <p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.username)
</th>
<th>
@Html.DisplayNameFor(model => model.salary)
</th>
<th></th>
</tr> @foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.username)
</td>
<td>
@Html.DisplayFor(modelItem => item.salary)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.id }) |
@Html.ActionLink("Details", "Details", new { id=item.id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.id })
</td>
</tr>
} </table>

  再次查看列表页面,显示正常:

  

  4. ef架构模型及C-S mapping(ConceptualModels-StorageModels)

  StorageModels:可以理解为仓库模型或者就是持久化的模型(物理模型)定义,在对定义了数据库存储的结构如:

  

  ConceptualModels:可以理解为概念上的,类对象层面的模型结构,如:

  

  而,物理模型和概念模型,之间形成O-R mapping的对应关系:

  

  我们在数据库中修改某些字段类型之后,完全可以据此直接使用文本文件打开对应的 *.edmx 修改该xml文件对应字段的字段类型,之后在vs中会自动提示重新加载,就可以达到修改字段的目的。同样,掌握这个结构可以直接针对添加数据库表字段的情况,进而编辑该xml文件,添加对应的节点,达成效果。

  5.code-first的方式以及启动数据迁移 //todo

  6.生产环境情况的更新模式 //todo

ef的更多相关文章

  1. %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91

    "%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...

  2. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  3. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...

  4. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  5. EntityFramework之DetectChanges's Secrets(三)(我为EF正名)

    前言 对于应用程序开发者来说,通常不需要考虑太多对于Entity Framework中的变更追踪(change tracking),但是变更追踪和DetectChanges方法是栈的一部分,在这其中, ...

  6. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  7. 使用EF CodeFirst 创建数据库

    EntityFramework 在VS2015添加新建项时,选择数据->ADO.NET 实体数据模型,有一下选项 来自数据库的EF设计器,这个就是我们最常用的EntityFramework设计模 ...

  8. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  9. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  10. 模仿EF,我们用JS开发的HTML5 SQLite 访问库

    今天终于有空把demo放到了RunJS上面去.请使用google chrome观看在线演示: http://sandbox.runjs.cn/show/pekbd9zb 这个库本来是我们开发的phon ...

随机推荐

  1. PHP获取上个月最后一天的一个容易忽略的问题

    正常来说,PHP是有一个很方便的函数可以获取上个月时间的 strtotime (PHP 4, PHP 5, PHP 7) strtotime - 将任何英文文本的日期时间描述解析为 Unix 时间戳 ...

  2. 用游标实现查询当前服务器所有数据库所有表的SQL

    declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...

  3. 【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~

    一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道Coordina ...

  4. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存

    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...

  5. iOS有关横向TableView的东西

    之前看到Apple store里面有横向的tableview,当然也有可能是collectionview啦. 尤其是项目中只有一条那么需要横向滑动的东西,就没有必要使用庞大的collectionvie ...

  6. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  7. ASP.NET MVC关于Ajax以及Jquery的无限级联动

    ---恢复内容开始--- 第一次发表博文,发表博文的目的是巩固自己的技术,也能够共享给大家.写的不好的地方,希望大家多给给意见.老司机勿喷 数据结构() NewsTypeId 新闻ID, NewsTy ...

  8. C#关于分页显示

    ---<PS:本人菜鸟,大手子还请高台贵手> 以下是我今天在做分页时所遇到的一个分页显示问题,使用拼写SQL的方式写的,同类型可参考哦~ ------------------------- ...

  9. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  10. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...