ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。
ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。
版本
|
支持.NET
|
发布情况
|
备注
|
Entity Framework 3.5
|
2.0+
|
包含于.NET 3.5中
|
支持EDMX生成,通过扩展可支持POCO类的生成
|
Entity Framework 4.0
|
4.0+
|
包含于.NET 4.0中
|
|
Entity Framework 4.X
|
4.0+
|
可通过NuGet获取
|
支持Database First、Model First、Code First三种生
成模式
|
Entity Framework 4.5
|
4.5+
|
集成于.NET 4.5中
|
|
Entity Framework 5.X
|
4.5+
|
可通过NuGet获取
|
支持枚举字段,性能有较大提升,支持.NET 4.0的版本
为Entity Framework 4.4
|
以上从百度百科摘来的,简单说就是一种ORM框架。
以前编程都是原生的ADO.NET,步骤实在繁琐,开发效率也不高,小项目小系统性能上的优势又不明显,维护起来也很累。草根创业的初期,公司开发人员可能就1个,没有专门的美工、DBA等。能最快开发出东西才是王道,同时又要灵活可扩展规范,这需要技术人员基础扎实、学习能力强、需要什么学习什么,马上用什么。这几天学习了下EF发现优点挺多,可以认真关注于开发、更快的开发出一个小型项目。对比下ADO.NET EF的Database-first Model-first Code-first 开发一个简单应用:
简单的一个登录表。
ADO.NET 登录代码如下:
private static void Main(string[] args)
{
while (true)
{
string username;
string password;
string sqlstr = "server=.;uid=sa;pwd=sa;database=Test";
Console.WriteLine("请输入用户名:");
username = Console.ReadLine();
Console.WriteLine("请输入密码:");
password = Console.ReadLine();
using (SqlConnection conn = new SqlConnection(sqlstr))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "select COUNT(*) from LoginUser where " +
"username=@username and password=@password";
cmd.Parameters.Add(new SqlParameter("@username ", username));
cmd.Parameters.Add(new SqlParameter("@password ", password));
conn.Open();
int result = (int)cmd.ExecuteScalar();
if (result > 0)
{
Console.WriteLine("登录成功。");
}
else
{
Console.WriteLine("登录失败。");
}
}
}
}
}
DataBase-first(数据库先行):
第一步:在项目里面添加一个ADO.NET 实体数据模型
添加完成后,主程序代码如下:
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("请输入用户名:");
string username = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();
TestEntities dbcontext = new TestEntities();
var result = (from r in dbcontext.LoginUser
where r.UserName == username && r.PassWord == password
select r).SingleOrDefault();
if (result !=null)
{
Console.WriteLine("登录成功。");
}
else
{
Console.WriteLine("登录失败。");
}
}
}
核心代码少了好多,直接写上linq查询语句,其他交给EF处理。
Model-first 模型先行,数据库可以先不用建立,直接在VS里面建模然后生成到数据库。
还是添加ADO.NET实体模型,不过选择空模型:
在模型界面空白处右击,弹出如下菜单,选择 新增-》实体。
接着在新增加的实体上面右击,选择添加 标量。
按下 F4 可以在属性窗口设置 类型,是否可空,以及最大长度等。
添加完全部的 标量后 ,在空白地方单击右键:
点击完成后,在资源管理器里面会多出一个:Model1.edmx.sql文件。然后空白地方右击
一执行数据库里面就会多新增加的LoginUser2表。
代码如下,新建立的表没有数据,顺便添加了一个用户:
static void Main(string[] args)
{
Model1Container dbcontext = new Model1Container();
LoginUser2 newuser = new LoginUser2();
newuser.UserName = "sa";
newuser.PassWord = "sa";
dbcontext.Entry(newuser).State = EntityState.Added;
dbcontext.SaveChanges();
while (true)
{
Console.WriteLine("请输入用户名:------ModelFirst----------");
string username = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();
var result = (from r in dbcontext.LoginUser2
where r.UserName == username && r.PassWord == password
select r).SingleOrDefault();
if (result != null)
{
Console.WriteLine("登录成功。");
}
else
{
Console.WriteLine("登录失败。");
}
}
}
接下来就是最适合新的中小项目开发的Code-first,直接写代码:
第一步:添加模型类(loginuser3.cs),添加DataAnnotations引用
接下来:添加一个Context 类,添加EF5.0的引用,同时在APP.CONFIG里面添加数据库的连接字符串testlogin。
好了,这样就OK了,接下来就是写代码了。
static void Main(string[] args)
{
LoginContext dbcontext = new LoginContext();
dbcontext.Database.CreateIfNotExists();//如果没有数据库就创建一个
LoginUser3 newuser = new LoginUser3();
newuser.UserName = "sa";
newuser.PassWord = "sa";
dbcontext.Entry(newuser).State = EntityState.Added;
dbcontext.SaveChanges();
while (true)
{
Console.WriteLine("请输入用户名:------CodeFirst----------");
string username = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();
var result = (from r in dbcontext.Loginuser
where r.UserName == username && r.PassWord == password
select r).SingleOrDefault();
if (result != null)
{
Console.WriteLine("登录成功。");
}
else
{
Console.WriteLine("登录失败。");
}
}
}
运行后会发现,多出来了LoginUser3这个表。