【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 的现有应用程序。
相关推荐
初九之潜龙勿用26 分钟前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
Smartdaili China1 小时前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
吾与谁归in2 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in2 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
神仙别闹3 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
向宇it12 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo13 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC14 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
baivfhpwxf202314 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾14 小时前
Scala全文单词统计
开发语言·c#·scala