什么是EF
EF全称EntityFramework,和Dapper一样,是一个ORM工具,那什么是ORM呢? ORM就是Object-Relational Mapping(对象-关系映射,简称ORM),对象和关系数据是业务实体的两种表现形式,ORM就相当于一个中间件,起到了对象和数据库数据之间的映射。
EF有三种开发方式:Code First,DB First和Model First(不推荐使用)
我们主要说说Code First和DB First两种方式:
Code First的方式就是我们需要代码创建类,在代码中标明类与类之间的关系,比如主键、外键等。运行代码后系统会自动的为我们创建数据库和对应的表,但是使用这种方式创建的数据库不方便建立对应的约束关系。因此在正式项目中还是推介使用DB First的方式,先创建数据库,再进行代码的编写。
Code First使用
新建一个控制台应用程序,安装EF的Nuget包。之后修改App.config
<!--新增联系数据库-->
<connectionStrings>
<add name="UserContext" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=CodeFirstDb;Integrated Security=True"/>
</connectionStrings>
接着我们新建Model文件夹,创建了三个类User、Role和UserRole
public class User
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public virtual List<UserRole> UserRoles { get; set; }
}
public class Role
{
public int ID { get; set; }
public string RoleName { get; set; }
public string RoleDesc { get; set; }
public virtual List<UserRole> UserRoles { get; set; }
}
public class UserRole
{
public int ID { get; set; }
public int UserID { get; set; }
public int RoleID { get; set; }
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
代码解释
- EF生成数据库时,ID 属性将会成为主键(约定:EF默认会将ID或classnameID生成主键)
- EF 生成数据库时,[表名+主键名]这种形式的会成为外键( 约定 )
例如外键 SysUserID = SysUser(navigation property)+ID(SysUser的主键) - User和UserRole是一对多的关系, Role和UserRole也是一对多的关系。如果是 "多", 属性类型就必须是list(Icollection)
接着我们新建一个DAL文件夹,创建两个类UserContext和UserInitializer
public class UserContext: DbContext
{
public UserContext() : base("UserContext")
{}
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
protected override void OnModelCreating(DbModelBuilder builder)
{
builder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
代码解释
- 通常情况下一DbSet对应数据库中的一张表
- 定义了一个构造函数,这边显示的展示了出来
- 重写OnModelCreating,可以修改EF的一些默认配置
- builder.Conventions.Remove<PluralizingTableNameConvention>();这是移除了EF关于表名的约定。否则生成的表回事复数形式。
接下来我们创建Initializer,使用EF来初始化数据库,将数据插入数据库
public class UserInitializer : DropCreateDatabaseIfModelChanges<UserContext>
{
protected override void Seed(UserContext context)
{
var user = new List<User>
{
new User() { UserName="Jack",Password="123",Email="89789@qq.com"},
new User() { UserName="Curry",Password="123",Email="7897@qq.com"},
new User() { UserName="Alan",Password="123456",Email="68979@qq.com"}
};
user.ForEach(s => context.Users.Add(s));
var role = new List<Role>
{
new Role() { RoleName="Admin",RoleDesc="Share EveryThing"},
new Role() { RoleName="Parts Admin",RoleDesc="This Is Parts Admin"}
};
role.ForEach(s => context.Roles.Add(s));
context.SaveChanges();
}
}
代码解释
- DropCreateDatabaseIfModelChanges说明是在程序第一次运行时会新建数据库,插入测试数据;当model改变的时候删除数据库,重新创建数据库和插入数据
接下来修改配置文件App.config,在<entityFramework>节下新增
<contexts>
<context type="EFDemo.DAL.UserContext,EFDemo" disableDatabaseInitialization="false">
<databaseInitializer type="EFDemo.DAL.UserInitializer,EFDemo"></databaseInitializer>
</context>
</contexts>
代码解释
- context 配置节中,type 的值对应context类
- databaseInitializer 配置节中,type 的值对应initializer类
- 如果某个context节不需要使用了,将disableDatabaseInitialization设置为true
启动页修改代码
static void Main(string[] args)
{
using (UserContext db = new UserContext())
{
db.Users.ToList().ForEach(a =>Console.WriteLine("用户{0}的密码是:{1}",a.UserName, a.Password));
db.Roles.ToList().ForEach(a =>Console.WriteLine("角色{0}的说明是:{1}",a.RoleName, a.RoleDesc));
}
Console.ReadKey();
}
这边只是测试,并没有将数据的对应关系做判断。
运行后我们看到
查看下本地数据库,发现数据库和表已经创建完成。
DB First
DB First的理念就是先创建数据库,再对数据库进行操作
数据库和表创建完成后新建一个控制台应用程序,添加ADO.NET 数据对象模型
新建连接,选择对应的数据库名和用户名密码
之后选择你需要的表即可。
下面写一段代码测试下
static void Main(string[] args)
{
using (DBFirstDbEntities dbContext = new DBFirstDbEntities())
{
UserInfo user = newUserInfo();
user.UserName = "Curry";
user.Password = "123456";
user.Email = "123@qq.com";
user.Gender =(int)gender.男;
dbContext.UserInfo.Add(usr);
dbContext.SaveChanges();
}
}
public enum gender
{
男 = 1,
女 = 2
}
代码解释
- 因为连接数据库是非常占用资源的,所以我们使用using在代码块执行完毕后立即释放资源,无需等待CLR的资源回收机制处理
-
DBFirstDbEntities就是你再新建数据库连接完成后另存到App.config中的
网友评论