您的位置:首页 > 其它

Entity Frame Code First 简易教程

2018-02-05 21:45 281 查看

简介

什么是ORM

搭建Entity FrameWork CodeFirst应用

数据库迁移

表属性常见配置

Entity FrameWork 一对多、多对多

一、简介

Entity Framework是微软的Object Relational Mapper(对象关系映射器),也就是我们平常说的ORM,它可以让应用程序开发者将关系型数据作为业务模型来使用。

Entity Framework分为 DabaBase First、Code First、Model First。本篇主要是结束Code First的一些应用。

Database First:这是一种用于已存在数据库模式的方法。使用这种方法,EDM是从数据库模式中生成的,这种方法最适合于使用了已经存在的数据库的应用。

Code First:这种方法中,所有的领域模型都是以类的形式编写的。这些类会建立我们的EDM,数据库模式会从这些类中创建。这种方法最适合于那些高度以领域为中心并且领域模型类创建优先的应用程序。这里需要的数据库只是为了这些领域模型的持久化机制。

Model First:这种方法和Code First方法很相似,但是这种情况下我们使用了EDM视觉设计器来设计我们的模型。数据库模式和类将会通过这个概念模型生成。该模型将会给我们创建数据库的SQL语句,然后我们可以使用它来创建数据库并连接应用程序。

下面是使用Entity Framework的一些好处:

因为开发者不需要为数据访问编写所有需要的ADO.NET管道代码,因此这可以节省很多开发时间。

我们可以使用更高级的语言(例如C#)来编写所有的数据访问逻辑而不是编写SQL查询和存储过程。

因为数据库表没有高级的关系(如继承),然而领域实体是可以有的,所以业务模型(也就是概念模型)可以使用实体间的关系来适配应用领域。

底层的数据存储可以相对轻松地被取代,因为所有的数据访问逻辑都呈现在应用层而不是数据层。

二、什么是ORM

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

三、搭建Entity FrameWork CodeFirst应用

使用 Entity FrameWork必须引用 EntityFrameWork.DLL 文件,

可以通过VS 工具/NuGet管理器/命令控制台,在出现的命令窗口上输入 Install-Pageage EntityFramework 命令,回车自动安装。

public class DBEntitys : DbContext
{
public DBEntitys()
: base("DBEntities")
{
this.Configuration.LazyLoadingEnabled = false;      //是否开启懒加载 [false/关闭]
}
public DBEntitys(string ConnStr)
: base(ConnStr)
{

}
public virtual DbSet<T_User> T_User { get; set; }
public virtual DbSet<T_Grade> T_Grade { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<T_User>()
.HasRequired<T_Grade>(a => a.T_Grade)
.WithMany(a => a.T_User);
}
}


View Code
执行数据库迁移命令以后,生成的表如下:



添加数据进行测试

class Program
{
public static readonly DBEntitys context = new DBEntitys();
static void Main(string[] args)
{
AddData();          //添加数据
var model = context.T_Grade.FirstOrDefault();
foreach (var item in model.T_User)
{
Console.WriteLine("Name:" + item.UserName);
}
Console.Read();
}
/// <summary>
/// 添加数据
/// </summary>
private static void AddData()
{
T_Grade t_Grade = new T_Grade() { GradeName = "一年级", GradeCode = "001" };
context.T_Grade.Add(t_Grade);
//一个班级对应两个用户
T_User t_User = new T_User() { UserName = "User1", Account = "admin", Sex = 1, Password = "123456", GradeId = t_Grade.Id };
T_User t_User2 = new T_User() { UserName = "User2", Account = "0001", Sex = 1, Password = "987654", GradeId = t_Grade.Id };
context.T_User.Add(t_User);
context.T_User.Add(t_User2);
int row = context.SaveChanges();
Console.Write("数据添加成功");//提示DB添加成功
}
}


Demo下载

2、多对多
在学校里,一个(用户)学生可能有多门课程。同样,一门课程可能有多个(用户)学生选择。

(用户)学生和课程就是多对多的关系。即 ICollection<T_User> t_User 和 ICollection<T_Courses> t_Courses。

public class T_User
{
public T_User()
{
t_Courses = new HashSet<T_Courses>();
}

/// <summary>
/// id
/// </summary>
[Required]
[Key]
public int Id { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Required]
[MaxLength(50)]
public string UserName { get; set; }
/// <summary>
/// 账号
/// </summary>
[Required]
[MaxLength(50)]
public string Account { get; set; }
/// <summary>
/// Sex
/// </summary>
[Required]
public int Sex { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required]
[MaxLength(100)]
[Column("Password", TypeName = "varchar")]
public string Password { get; set; }
/// <summary>
/// 地址
/// </summary>
[MaxLength(200)]
public string Address { get; set; }
/// <summary>
///
/// </summary>
[MaxLength(500)]
public string Memo { get; set; }
/// <summary>
/// 一个用户有多门课
/// </summary>
public virtual ICollection<T_Courses> t_Courses { get; set; }
}
  /// <summary>
/// 课程类
/// </summary>
public class T_Courses
{
public T_Courses()
{
t_User = new HashSet<T_User>();
}
/// <summary>
/// 主键ID
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 课程名
/// </summary>
[MaxLength(50),Column(TypeName="varchar")]
public string CourseName { get; set; }
/// <summary>
/// 一门课有多个用户
/// </summary>
public virtual ICollection<T_User> t_User { get; set; }
}


执行数据库迁移命令以后生成的数据表如下:



使用配置Fluent API配置多对多关系:

public class DBEntitys : DbContext
{
public DBEntitys()
: base("DBEntities")
{
this.Configuration.LazyLoadingEnabled = true;      //是否开启懒加载 [false/关闭]
}
public DBEntitys(string ConnStr)
: base(ConnStr)
{

}
public virtual DbSet<T_User> T_User { get; set; }
public virtual DbSet<T_Courses> T_Courses { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<T_User>()
.HasMany<T_Courses>(a => a.t_Courses)
.WithMany(a => a.t_User)
.Map(a =>
{
a.MapLeftKey("UserId");
a.MapRightKey("CourseId");
a.ToTable("User_Course");
});
}
}


执行测试:

class Program
{
public static readonly DBEntitys context = new DBEntitys();
static void Main(string[] args)
{
//AddData();          //添加数据
var model = context.T_User.FirstOrDefault();
foreach (var item in model.t_Courses)
{
Console.WriteLine("CourseName:" + item.CourseName);
}
Console.Read();
}
/// <summary>
/// 添加数据
/// </summary>
private static void AddData()
{
T_Courses chinese = new T_Courses() { CourseName = "语文" };
T_Courses math = new T_Courses() { CourseName = "数学" };
//一个班级对应两个用户
T_User t_User = new T_User() { UserName = "User1", Account = "admin", Sex = 1, Password = "123456" };

t_User.t_Courses.Add(chinese);
t_User.t_Courses.Add(math);
context.T_User.Add(t_User);
int row = context.SaveChanges();
Console.Write("数据添加成功");//提示DB添加成功
}
}


点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: