【Entity Framework】EF连接字符串和模型

【Entity Framework】EF连接字符串和模型

文章目录

  • [【Entity Framework】EF连接字符串和模型](#【Entity Framework】EF连接字符串和模型)
    • 一、概述
    • [二、使用 Code First 按约定创建连接](#二、使用 Code First 按约定创建连接)
    • [三、使用 Code First 和指定的数据库名称按约定创建连接](#三、使用 Code First 和指定的数据库名称按约定创建连接)
    • [四、将 Code First 与 app.config/web.config 文件中的连接字符串结合使用](#四、将 Code First 与 app.config/web.config 文件中的连接字符串结合使用)
    • [五、将 Database/Model First 与 app.config/web.config 文件中的连接字符串结合使用](#五、将 Database/Model First 与 app.config/web.config 文件中的连接字符串结合使用)
    • 六、总结

一、概述

本文将介绍如何使用数据库连接及如何更改数据库连接。使用Code First和EF设计器创建的模型在本文中都会说明。

通常,实体框架应用程序使用派生自DbContext的类。此派生类将调用基础DbContext类上的构造函数之一来控制:

  • 上下文如何连接到数据库 - 即如何找到/使用连接字符串。
  • 上下文是使用 Code First 计算模型还是加载使用 EF 设计器创建的模型、

二、使用 Code First 按约定创建连接

如果尚未在应用程序中进行任何其他配置,那么,调用 DbContext 上的无参数构造函数将导致 DbContext 以 Code First 模式运行,并按约定创建数据库连接。 例如:

c# 复制代码
namespace Common.EF
{
    public class BloggingContext : DbContext
    {
        public BloggingContext()
        {
        }
    }
}

在此示例中,DbContext 使用派生上下文类的命名空间限定名称 (Demo.EF.BloggingContext) 作为数据库名称,并使用 SQL Express 或 LocalDB 为该数据库创建连接字符串。 如果两者均已安装,则使用 SQL Express。

三、使用 Code First 和指定的数据库名称按约定创建连接

如果尚未在应用程序中进行任何其他配置,通过要使用的数据库名称调用 DbContext 上的字符串构造函数将导致 DbContext 以 Code First 模式运行,并按约定与具有该名称的数据库建立连接。 例如:

c# 复制代码
public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingDatabase")
    {
    }
}

DbContext 使用"BloggingDatabase"作为数据库名称,并使用 SQL Express(随 Visual Studio 2010 安装)或 LocalDB(随 Visual Studio 2012 安装)为该数据库创建连接字符串。 如果两者均已安装,则使用 SQL Express。

四、将 Code First 与 app.config/web.config 文件中的连接字符串结合使用

你可以选择将连接字符串放在 app.config 或 web.config 文件中。 例如:

xml 复制代码
<configuration>
  <connectionStrings>
    <add name="BloggingCompactDatabase"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=Blogging.sdf"/>
  </connectionStrings>
</configuration>

这是告诉 DbContext 使用 SQL Express 或 LocalDB 以外的数据库服务器的一种简单方法 - 上面的示例指定了 SQL Server Compact Edition 数据库。

如果连接字符串的名称与上下文的名称匹配(带或不带命名空间限定),那么当使用无参数构造函数时,DbContext 将找到它。 如果连接字符串名称与上下文名称不同,则可以通过将连接字符串名称传递给 DbContext 构造函数,告诉 DbContext 在 Code First 模式下使用此连接。 例如:

c# 复制代码
public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingCompactDatabase")
    {
    }
}

或者,可以对传递给 DbContext 构造函数的字符串使用格式"name="。 例如:

c# 复制代码
public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("name=BloggingCompactDatabase")
    {
    }
}

此格式明确表示你希望在配置文件中找到连接字符串。 如果未找到具有给定名称的连接字符串,则会引发异常。

五、将 Database/Model First 与 app.config/web.config 文件中的连接字符串结合使用

使用 EF 设计器创建的模型与 Code First 的不同之处在于,模型已经存在并且不是在应用程序运行时通过代码生成的。 该模型通常作为项目中的 EDMX 文件存在。

设计器会将 EF 连接字符串添加到 app.config 或 web.config 文件中。 此连接字符串的特殊之处在于,它包含有关如何在 EDMX 文件中查找信息的信息。 例如:

xml 复制代码
<configuration>  
  <connectionStrings>  
    <add name="Northwind_Entities"  
         connectionString="metadata=res://*/Northwind.csdl|  
                                    res://*/Northwind.ssdl|  
                                    res://*/Northwind.msl;  
                           provider=System.Data.SqlClient;  
                           provider connection string=  
                               &quot;Data Source=.\sqlexpress;  
                                     Initial Catalog=Northwind;  
                                     Integrated Security=True;  
                                     MultipleActiveResultSets=True&quot;"  
         providerName="System.Data.EntityClient"/>  
  </connectionStrings>  
</configuration>

EF 设计器还将生成代码,以通过将连接字符串名称传递给 DbContext 构造函数来告诉 DbContext 使用此连接。

c# 复制代码
public class NorthwindContext : DbContext
{
    public NorthwindContext()
        : base("name=Northwind_Entities")
    {
    }
}

DbContext 知道要加载现有模型(而不是使用 Code First 通过代码计算它),因为该连接字符串是一个 EF 连接字符串,其中包含要使用的模型的详细信息。

六、总结

DbContext 类包含其他构造函数和使用模式,可以实现一些更高级的方案。 其中一些功能包括:

  • 你可以使用 DbModelBuilder 类生成 Code First 模型,而无需实例化 DbContext 实例。 此操作将生成一个 DbModel 对象。 然后,当你准备好创建 DbContext 实例时,可以将此 DbModel 对象传递给 DbContext 构造函数之一。
  • 你可以将完整的连接字符串传递给 DbContext,而不只是传递数据库或连接字符串名称。 默认情况下,此连接字符串与 System.Data.SqlClient 提供程序一起使用;可以通过在 context.Database.DefaultConnectionFactory 上设置不同的 IConnectionFactory 实现来更改此行为。
  • 你可以通过将现有 DbConnection 对象传递给 DbContext 构造函数来使用它。 如果连接对象是 EntityConnection 的实例,则将使用连接中指定的模型,而不是使用 Code First 计算模型。 如果对象是某种其他类型的实例(例如,SqlConnection),上下文会将其用于 Code First 模式。
  • 你可以将现有 ObjectContext 传递给 DbContext 构造函数,以创建包装现有上下文的 DbContext。 这可用于使用 ObjectContext 但希望在应用程序的某些部分利用 DbContext 的现有应用程序。
相关推荐
flashman9111 小时前
python在word中插入图片
python·microsoft·自动化·word
△曉風殘月〆5 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風7 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747410 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo10 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
徒步僧11 小时前
ThingsBoard规则链节点:RPC Call Reply节点详解
qt·microsoft·rpc
九鼎科技-Leo12 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发12 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术12 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒13 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节