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来指定需要的数据库初始化方式,在方法 protected override void OnModelCreating(DbModelBuilder modelBuilder)进行设置,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>();
}
}
}
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>();
}
}
}

代码写好后,可以在工具->库程序包管理器->程序包管理器控制台中执行如下几部:

1:Enable-Migrations:打开迁移,如果已经存在了,则不需要再启动这个命令
按回车键后,会生成Migrations文件夹,以及Migrations文件夹下面的Configuration类和201711281316287_InitialCreate类
 
2:Add-Migration createDataBase(本次修改的内容): 将创建下一次基于上一次迁移以来的更改的迁移,具体的内容可以在第一步生成的类中看到
 
3:Update-Database :将刚刚生成的脚本更新到数据库,如果不执行,数据库将不会发生改变

注意:执行以上几步时,需要注意一下启动项,启动选不对,会发生很多错误

c# EF code First生成数据库以及表的更多相关文章

  1. EF Code First生成的数据表去复数(去掉数据表最后面那个s) 和 EF decimal 小数位的保留

    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTabl ...

  2. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  3. EF Code First 更新数据库, 数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  4. C# EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  5. EF Code First Migrations数据库迁移 (转帖)

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  6. 【EF】EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  7. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

  8. EF Code First更新数据库时报错:provider: SQL Network Interfaces, error: 26

    在使用EF Code First更新数据库时报如下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Serv ...

  9. EF Code First 学习笔记:表映射

    多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...

随机推荐

  1. ModelAndView返回json对象的方法

    这是在spring4之后. @RequestMapping(value = "/returnjson") public ModelAndView getfsd(){ ModelAn ...

  2. linux-ssh登陆导语

    用户登录前显示的导语信息(在你选择的文件中配置,例如 /etc/login.warn) 用户成功登录后显示的导语信息(在 /etc/motd 中配置) 如何在用户登录前连接系统时显示消息 当用户连接到 ...

  3. 【HDU1000】A+B Problem

    题目来源:www.acm.hdu.edu.cn 题目编号:1000  A+B Problem /*----------------------------------------原题目-------- ...

  4. bash基础特性2

    命令别名(alias) ()alias 显示当前shell进程所有可用的命令别名: ()alias NAME='VALUE' 定义别名NAME,相当于执行命令value ()unlias 撤销别名 注 ...

  5. MySQL--Insert Buffer

    在进行数据插入时,需要将数据插入到聚集索引和非聚集索引中,而对于非聚集索引,需要先确定数据要插入的索引页,再将索引页加载到内存中进行修改,而在业务上很难保证插入数据在非聚集索引上也是连续的,因此插入操 ...

  6. Android插件化的兼容性(上):Android O的适配

    首先声明,<Android插件化开发指南>这本书所介绍的Android底层是基于Android6.0(API level 23)的,而本书介绍的各种插件化解决方案,以及配套的70多个例子, ...

  7. Dash by Plotly 学习笔记

    一.介绍 1.dash 是什么 dash 是一个基于 Flask (Python) + React 的 web 框架. 入门指南:https://dash.plot.ly/getting-starte ...

  8. ubuntu 16.04 下安装动态链接库方法

    一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...

  9. vmware中nat模式中使用静态ip后无法上网的问题

    在/etc/network/interfaces中添加静态ip auto eth0iface eth0 inet staticaddress 192.168.31.133netmask 255.255 ...

  10. 过了所有技术面,却倒在 HR 一个问题上。。

    面试问离职原因,这是我们广大程序员朋友面试时逃不开的问题,如果答得不好,可能就影响了你整个的面试结果. 最近在栈长的Java技术栈vip群里,我也看到大家在讨论这个问题,其中有个朋友的回复栈长很有感触 ...