原文:https://msdn.microsoft.com/en-us/data/jj592674

应该选择CodeFirst、ModelFirst还是databaseFirst网上已经很多资料了,这里不多说。

本文主要包含了EF怎样发现使用哪个数据库连接,以及怎样改变它。模型可以用CodeFirst和EF设计器创建。

通常,EF应用程序会有一个继承自DbContext的类,这个继承的类调用基类DbContext的一个构造函数,EF应用程序就是利用这个类(本文中也称为上下文类)来控制下面的内容:

1、Context怎样连接到一个数据库——例如Connection string 怎样被发现和使用

2、Context是用 CodeFirst创建一个模型还是用EF设计器创建一个模型

3、其他高级选项

  • 使用CodeFirst的约定连接(按照EF约定创建连接)

如果在应用程序中没有做任何配置,那么调用DbContext的无参数构造函数时会使用CodeFirst模式按照约定来创建一个数据库及其连接。这个约定就是:数据库名称由 上下文类所在的命名空间+"."+上下文类名称。例如:

namespace Demo.EF 



    
public class BloggingContext : DbContext 

    


        
public BloggingContext() 

        
// C# will call base class parameterless constructor by default 

        


        


    


}

这个例子中,会在SQL Express或者Loacl Db中创建一个使用"Demo.EF.BloggingContext"作为数据库名的数据库,其中“Demo.EF”是上下文类所在的命名空间,“BloggingContext”是上下文类的名称。 这时,你去查看配置文件发现,没有增加任何与数据库连接相关的字符串信息。事实上,EF默认去本机查找SQLExpress或者LocalDb中名字为"Demo.EF.BloggingContext"的数据库。

VS2010中默认安装的SQL Express,VS2012中默认安装的是LocalDb,如果SQL Express和LocalDb都安装的话,那么EF会选择在SQL Express中创建数据库。

  • 使用CodeFirst的约定连接并指定数据库名称

如果在应用程序中没有做任何配置,那么调用构造函数时,可以给它一个string类型的参数,这样将建立一个以该参数为名字的数据库。例如:

public class BloggingContext : DbContext 



    
public BloggingContext(): base("BloggingDatabase") 

    


    


}

例子中将在SQL Express或者LocalDb中创建名称为"BloggingDatabase"的数据库。同样,如果SQL Express和LocalDb都安装的话,那么EF会选择在SQL Express中创建数据库。

  • 使用CodeFirst及配置文件中的connection string

你也可以选择先先在配置文件中设置好connection string。例如:

<configuration> 

  
<connectionStrings> 

    
<add name="BloggingCompactDatabase" 

         
providerName="System.Data.SqlServerCe.4.0" 

         
connectionString="Data Source=Blogging.sdf"/> 

  
</connectionStrings> 

</configuration>

然后,创建数据库上下文时使用下面的代码:

public class BloggingContext : DbContext 



    
public BloggingContext(): base("BloggingCompactDatabase") 

    


    


}

此时,创建数据库时,就会使用ConnectionString中指定的服务器和数据库名字。

你会发现这里创建数据库上下文的代码与上一节的非常相似,除了参数名字不一样。事实上,上面一段代码执行的时候,EF首先查找配置文件中有没有以“BloggingCompactDataBase”命名的连接字符串,如果有则使用该连接字符串,连接数据库(数据库未创建时会自动创建)。如果没有,那么会在SQLExpress或者LocalDb中名创建数名为“BloggingCompactDataBase”的数据库。

或者,也可以用“name=<connection string name>” 作为基类DbContext的构造函数的参数。例如:

public class BloggingContext : DbContext 



    
public BloggingContext() 

        
: base("name=BloggingCompactDatabase") 

    


    


}

注意:这种形式明确说明需要在配置文件中找到名字为“BloggingCompactDataBase”的连接字符串,如果没有找到,则会抛出异常。

  • 使用Database/Model First 及配置文件中的连接字符串

ModelFirst与CodeFirst不同,Models通过EF设计器创建,Models通常以EMDX文件的存在。

设计器会添加一个EF连接字符串到配置文件中。这个连接字符串比较特殊,它包括怎样从EDMX文件中获取信息。例如:

<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使用这个连接字符串。

public class NorthwindContext : DbContext 



    
public NorthwindContext() 

        
: base("name=Northwind_Entities") 

    


    


}

DbContext就会装入已经存在的model,而不是使用CodeFirst从code中计算,因为连接字符串是一个EF Connection string,其中包含了使用的model的细节。

  • DbContext的其他构造函数选择

DbContext类包含其他构造函数和使用模式,适用于一些更复杂的场景。具体可以参看原文,

Entity Framework(1)——Connections and Models的更多相关文章

  1. MVC & Entity Framework(2)- controller、Models单独DLL

    继上一篇MVC & Entity Framework(1)- 开发环境之后,已经很久没更新了.接下来记录一下怎么把MVC中的controller单独拆为一个类库,然后在web项目中引用.另外, ...

  2. LINQ之路10:LINQ to SQL 和 Entity Framework(下)

    在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术 ...

  3. LINQ之路 9:LINQ to SQL 和 Entity Framework(上)

    在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...

  4. MVC & Entity Framework(1)- 开发环境

    一直都有接触asp.net mvc,希望自己借此次机会把Blog搭起来的同时能够更深入地学习相关知识. ①新建 打开VS2012,新建ASP.Net MVC 4项目,接着选择“空”模板(因为不想用自带 ...

  5. Entity Framework(一) 映射

    ADO.NET Entity Framework通过Modeel First和DataBase First,提供了几个把数据库表映射到对象上的曾.通过Database First,可以从一个数据库架构 ...

  6. Entity Framework(六):数据迁移

    在前面的几篇文章中,简单的介绍了如何使用Entity Framework的Code First模式创建数据库,但是,在前面的几篇文章中,我们都是通过使用数据库初始化策略来做,也就是每次先删除数据库然后 ...

  7. Entity Framework(二)

    1. ORM :Object Relation Mapping ,通俗说:用操作对象的方式来操作数据库. 2. 插入数据不再是执行Insert,而是类似于 Person p=new Person() ...

  8. Chapter1-data access reloaded:Entity Framework(上)

    本章包括以下几个部分: 1.DataSet and classic ADO.NET approach2.Object model approach3.Object/relational mismatc ...

  9. Entity Framework(序)

    ADO.NET Entity Framework 是一个对象-关系的映射结构,它提供了ADO.NET的一个抽象,可基于引用的数据库获取对象模型.可以通过Entity Framework 使用不同的变成 ...

随机推荐

  1. telnet 查看端口是否可访问

      1. 首先为什么要写这篇文章 说到为什么还得从DNS服务器说起.我在我的电脑上安装了DNS服务器,但是用网络去访问还怎么都访问都不上去.于是我就打开dos窗口,用ping命令查看是否可以ping( ...

  2. DNX 概览

    来源https://docs.asp.net/en/latest/dnx/overview.html .NET Execution Environment是什么 .NET Execution Envi ...

  3. [置顶] kubernetes资源类型--PetSets/StatefulSet

    PetSet首次在K8S1.4版本中,在1.5更名为StatefulSet.除了改了名字之外,这一API对象并没有太大变化. 注意:以下内容的验证环境为CentOS7.K8S版本1.5.2,并部署Sk ...

  4. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  5. python的序列化

    参考:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868322157 ...

  6. linux文件传输

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp常用来在两台linux之间传输文件 Secure Ftp 是一个基 ...

  7. 【Hadoop】Hadoop DataNode节点超时时间设置

    hadoop datanode节点超时时间设置 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间 ...

  8. ASP.NET MVC学习---(四)MVC初窥

    前面三篇大幅度的介绍了EF框架 这并不是没有道理的 现在使用mvc开发一般都离不开ef 因为它们相结合可以为你带来完美的体验 当然 前面所描述的仅仅是ef框架的冰山一角 它是一门学问很深的功课 如果你 ...

  9. 开源jabber(XMPP)架设内部即时通讯服务的解决方案

    Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用.    XMPP(可扩展消息处理现场协议)是基于可扩展 ...

  10. jQuery的AJax异步载入片段

    主要用到load()方法以及getScript()方法,详细以一个样例说明: 在现有html文件里载入一个拟好的片段,以及在片段载入完毕之前阻止用户进一步操作的弹出框. 首先是现有html代码.无不论 ...