【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 的现有应用程序。
相关推荐
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
禁默4 小时前
2024年图像处理、多媒体技术与机器学习
图像处理·人工智能·microsoft
坐井观老天7 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
Zmxcl-0078 小时前
IIS解析漏洞
服务器·数据库·microsoft
pchmi9 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉
蚁景网络安全11 小时前
Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本
windows·microsoft
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭11 小时前
C#都可以找哪些工作?
开发语言·c#
m0_6632340111 小时前
在 .NET 5.0 运行 .NET 8.0 教程:使用 ASP.NET Core 创建 Web API
前端·asp.net·.net
boligongzhu13 小时前
Dalsa线阵CCD相机使用开发手册
c#