Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html
Entity Framework Code First数据库连接
1. 安装Entity Framework
使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句:
PM> Install-Package EntityFramework
2. Entity Framework数据库连接配置
安装了Entity Framework之后,会自动添加App.config 文件。该文件中配置了Entity Framework的DefaultConnectionFactory,修改数据库连接字符串之后的连接具体如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
</configuration>
在进行上面的为Entity Framework设置DefaultConnectionFactory之后,使用Entity Framework连接数据库不需再在其他地方进行设置,Entity Framework也不需要指定数据库连接。
Entity Framework连接数据库除了以上的方式,也可以通过配置常用的connectionStrings,修改App.config如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="PortalContext" connectionString="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
3. Entity Framework DbContext连接数据库
新建类文件PortalContext.cs,具体代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Data.Entity; namespace Portal
{
public class PortalContext : DbContext
{
static PortalContext()
{
Database.SetInitializer<PortalContext>(null);
//Database.SetInitializer(new CreateDatabaseIfNotExists<PortalContext>());
//Database.SetInitializer(new DropCreateDatabaseAlways<PortalContext>());
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
} public PortalContext()
: base("name=PortalContext")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
}
在PortalContext.cs中,使用了类的静态构造函数及构造函数。其中,在静态构造函数中设置数据库的初始化方式,在构造函数中指定App.config的connectionString。
3.1 Entity Framework数据库初始化方式
Entity Framework通过Database.SetInitializer来指定需要的数据库初始化方式,Database.SetInitializer可指定的数据库共有3种:
1>. CreateDatabaseIfNotExists
CreateDatabaseIfNotExists是Database.SetInitializer指定数据库的默认方式,用于当数据库不存在时,自动创建数据库。由于该方式是默认方式,所以可以不需要任何代码进行指定,当然也可以使用代码来明确的指定。
Database.SetInitializer(new CreateDatabaseIfNotExists<PortalContext>());
2>. DropCreateDatabaseWhenModelChanges
DropCreateDatabaseWhenModelChanges用于当数据模型发生改变时,先删除原数据库,后创建新的数据库。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
3>. DropCreateDatabaseAlways
DropCreateDatabaseAlways用于每次均先删除原数据库再创建新的数据库,不管数据模型是否发生改变。
Database.SetInitializer(new DropCreateDatabaseAlways<PortalContext>());
但是,在很多时候,我们希望即使在Entity Framework Code First与数据库不匹配时,宁可Entity Framework Code First报出数据库连接错误,而不希望对数据库进行任何的删除创建操作。Entity Framework Code First提供关闭数据库初始化操作:
Database.SetInitializer<PortalContext>(null);
3.2 Entity Framework Code First连接数据库的一些设置
在实际使用Entity Framework Code First来操作数据库时,通常会在继承DbContext的类中作一些Entity Framework Code First的数据库操作设置。
1>. 禁用延迟加载(Lazy Loading)
在存在引用关系的两个实体类中,一个类的实例可以通过关联关系获取与之对应的另外一个类的一个或多个实例。在这种获取的时候,Entity Framework Code First提供了默认的延迟加载功能。一个类的实例,在需要使用另外一个类对应的实例时,可以直接读取在类中定义的关联属性,Entity Framework将自动到数据库中去读取返回需要的记录。当然这是延迟加载的好处,同样延迟加载也存在一些不好的地方。在Entity Framework通过延迟加载去读取关联记录时,可能执行过多的SQL语句,与实际所预想的不一致,从而影响代码的执行效率。
设置默认禁用延迟加载,在需要Entity Framework读取关联数据记录时采用显示加载。
public PortalContext()
: base("name=PortalContext")
{
// 禁用延迟加载
this.Configuration.LazyLoadingEnabled = false;
}
2>. 禁用关系数据的级联删除
在存在关联关系的数据记录间,当主表记录被删除时,自动删除从表中关联的记录。这个是关系数据库中大都存在的功能,包括MS SQL Server同样也提供了该功能。然而在实际的项目中,往往不想使用这种级联删除功能,在需要删除关联的记录时,也一样编写代码来进行删除。
Entity Framework Code First设置默认禁用关联数据的级联删除功能:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 禁用一对多级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// 禁用多对多级联删除
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}
3>. 禁用默认表名复数形式
Entity Framework Code First在根据类名来生成数据表时,生成的数据表表名会是类名的复数形式。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 禁用默认表名复数形式
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
最后附上本篇随笔中PortalContext.cs的完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions; namespace Portal
{
public class PortalContext : DbContext
{
static PortalContext()
{
Database.SetInitializer<PortalContext>(null);
} public PortalContext()
: base("name=PortalContext")
{
// 禁用延迟加载
this.Configuration.LazyLoadingEnabled = false;
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 禁用默认表名复数形式
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
// 禁用一对多级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// 禁用多对多级联删除
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}
}
}
Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html的更多相关文章
- Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html
Entity Framework Code First属性映射约定 Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Flue ...
- Entity Framework Code First数据库连接
1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...
- Entity Framework Code first(转载)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- Entity Framework Code First学习系列
Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...
- Entity Framework Code First实现乐观并发
Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...
- 旧项目如何切换到Entity Framework Code First
Entity Framework Code First固然是好东西,然而如果是已经存在的旧有项目,如何简单方便的使用切换呢? 这里介绍一个VS的插件Entity Framework Power Too ...
- Entity Framework Code First 映射继承关系
转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...
- SQLITE WITH ENTITY FRAMEWORK CODE FIRST AND MIGRATION
Last month I’ve a chance to develop an app using Sqlite and Entity Framework Code First. Before I st ...
随机推荐
- ngnix高并发的原理实现(转)
英文原文:Inside NGINX: How We Designed for Performance & Scale 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在 ...
- HDFS数据流——读数据流程
HDFS读数据流程 假设客户端请求下载文件/user/atguigu/ss.avi,HDFS读数据流程如下: 1)客户端向namenode请求下载文件,namenode通过查询元数据,找到文件所有文件 ...
- java_第一年_JavaWeb(10)
JavaWeb的两种开发模式 JSP+JavaBean框架:JavaBean负责封装数据.提供方法,JSP负责处理用户请求和显示数据:只能开发较为简单的业务: JSP+JavaBean+Servlet ...
- 【洛谷p3958】奶酪
奶酪[题目链接] 题前废话不知道说啥了啊qwq(越来越沉默寡言) 好了看题: SOLUTION: 思路的话,大概是搜索,然后大概广搜??? 但是我们今天写深搜(也是听xcg大佬讲了以后的整理博) 首先 ...
- HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)
Problem Description A group of explorers has found a solitary island. They land on the island and ex ...
- Spring事务管理之几种方式实现事务(转)
一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- Malware分析
//文章来源:http://www.2cto.com/Article/201312/265217.html by Kungen@CyberSword 想要查找恶意样本,首先要知道查找样本所需的基本信息 ...
- 基于 SwiftUI 创建一个可删除、可添加列表项的列表
执行环境 macOS Mojave: 10.14.5 xcode: Version 11.0 beta 6 (11M392q) 预览效果 完整代码 import SwiftUI class Item: ...
- python函数传参和返回值注意事项
函数传参 空参数 定义函数时括号里面没有形参,调用时不用传参. def func(): print('null para.') # 调用 func() 位置传参 规定形参的数量,调用时必须传递相同数量 ...
- [POI2006]ORK-Ploughing(贪心,枚举)
[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...