zoukankan      html  css  js  c++  java
  • Entity Framework(1)——Connections and Models

    原文: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类包含其他构造函数和使用模式,适用于一些更复杂的场景。具体可以参看原文,





  • 相关阅读:
    Vue ui创建vue-cli 3.0项目
    Vue中封装axios
    微信小程序自定义顶部导航
    linux离线安装docker
    解决websocket不能@Autowired注入问题
    springboot 连接 Access数据库
    Flex 布局教程:语法篇
    通过代码来了解下java策略模式,消除if-else
    docker下安装FastDFS
    centos7下安装docker
  • 原文地址:https://www.cnblogs.com/liyanwei/p/8c694fca30b4d1bd532177049326e59a.html
Copyright © 2011-2022 走看看