Entity Framework Code First数据库连接

参考页面:

http://www.yuanjiaocheng.net/entity/entitytypes.html

http://www.yuanjiaocheng.net/entity/entity-relations.html

http://www.yuanjiaocheng.net/entity/entity-lifecycle.html

http://www.yuanjiaocheng.net/entity/code-first.html

http://www.yuanjiaocheng.net/entity/mode-first.html

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>();
        }
    }
}
时间: 2024-10-25 23:35:17

Entity Framework Code First数据库连接的相关文章

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 5.0仅支持MS SQL Server数据库.在接下来的随笔中,均使用项目名称为Portal的控制台应用程序为例.具体的系统学习目

Entity Framework Code First (三)Data Annotations

Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表示 EF 所依赖的模型去执行查询.更改追踪.以及更新功能,这意味着你的 domain classes 必须遵循 EF 所使用的约定.然而,如果你的 domain classes 不能遵循 EF 所使用的约定,此时你就需要有能力去增加一些配置使得你的 classes 能够满足 EF 所需要的信息. C

Entity Framework Code First数据库迁移(DB Migration)

一.手动迁移 第1步.启用数据库迁移 打开程序包管理器控制台 工具->库程序包管理器->程序包管理器控制台 打开控制台后,在控制台管理窗口输入 Enable-Migrations 指令,铵下回车键,到这里已启用了数据库迁移,但还没执行,结果如下图: 第2步.运行数据库迁移 在控制台管理窗口输入 Add-Migration指令,来新增一条数据库迁移版本,输入时必须要带上一个版本名称 Add-Migration AddProductCategoryTypeName,如下图: 运行完成后会在解决方案

Entity Framework Code First 映射继承关系

转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code First有三种处理类之间继承关系的方法,我们将逐一介绍这三种处理方法. 1.Table Per Hierarchy(TPH): 只建立一个表,把基类和子类中的所有属性都映射为表中的列. 2.Table Per Type(TPT): 为基类和每个子类建立一个表,每个与子类对应的表中只包含子类特有的属性对

Entity Framework Code First属性映射约定

参考页面: http://www.yuanjiaocheng.net/entity/code-first.html http://www.yuanjiaocheng.net/entity/mode-first.html http://www.yuanjiaocheng.net/entity/database-first.html http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://www.yuan

Entity Framework Code First 常用方法集成

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

Entity Framework Code First执行SQL语句、视图及存储过程

1.Entity Framework Code First查询表或视图 var provincelist = ctx.Provinces.SqlQuery("SELECT TOP 10 * FROM Province"); foreach (var province in provincelist) { Console.WriteLine("{0}-{1}-{2}", province.ProvinceID, province.ProvinceNo, provinc

ADO.NET Entity Framework -Code Fisrt 开篇(一)

ADO.NET Entity Framework -Code Fisrt 开篇(一) 2012-12-25 15:13 by 易code, 911 阅读, 0 评论, 收藏, 编辑 ADO.NET Entity Framework 是微软的一套实体映射框架.发布EF4.1(Entity Framework )时,又提出了代码先行的设计理念(the code comes first, the rest follows).具体好处哪是多多,查资料吧. 参考资料:Programming Entity

Entity Framework Code First (二)Custom Conventions

------------------------------------------------------------------------------------------------------------ 注意:以下所讨论的功能或 API 等只针对 Entity Framework 6 ,如果你使用早期版本,可能部分或全部功能不起作用! --------------------------------------------------------------------------