VS2017
中新建 Web ASP.NET Framework
项目【摘抄】
EF是一种ORM工具,ORM表示对象关联映射
在RDMS中,对象称为表格和列对象,而在.net中(面向对象)称为类,对象以及属性。任何数据驱动的应用实现的方式有两种:
通过代码与数据库关联(称为数据访问层或数据逻辑层)。
通过编写代码将数据库数据映射到面向对象数据,或反向操作。
ORM是一种能够自动完成这两种方式的工具。EF是微软的ORM工具。
什么是代码优先的方法?
EF提供了三种方式来实现项目:
数据库优先方法——创建数据库,包含表,列以及表之间的关系等,EF会根据数据库生成相应的Model类(业务实体)及数据访问层代码。
模型优先方法——模型优先指模型类及模型之间的关系是由Model设计人员在VS中手动生成和设计的,EF将模型生成数据访问层和数据库。
代码优先方法——代码优先指手动创建POCO类。这些类之间的关系使用代码定义。当应用程序首次执行时,EF将在数据库服务器中自动生成数据访问层以及相应的数据库。
什么是POCO类?
POCO即Plain Old CLR对象,POCO类就是已经创建的简单.Net类。在上两节的实例中,Employee类就是一个简单的POCO类。
查看Web.Config,定位项目根目录下的Web.Config, Entity Framework安装完成后,安装程序会主动更新该文件,可以看到配置中自动增加了如下配置信息
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
parameters>
defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
providers>
entityFramework>
【摘抄】
Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息(如最常用的设置ASP.NETWeb 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。
从官网下载并安装MySQL到目标服务器,这里下载安装的是 mysql-5.5.61-winx64.msi,安装过程注意记录配置的账户密码,字符集最好选择 utf8
下载并安装 mysql-connector-net-6.10.7.msi,这是MySQL的 ADO.NET驱动
下载并安装mysql-for-visualstudio-1.2.8.msi,该工具为Microsoft Visual Studio提供了访问MySQL对象和数据的通道
接下来回到Visual Studo界面,安装MySql Data Entity
**查看Web.Config, 此时
项内
项新增了如下信息:
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
provider>providers>
在解决方案项目任一文件夹点击右键,选择“添加”–“新建项”,查看VisualStudio新建项,此时“数据库”分类下已包含ADO.NET实体数据模型
项
配置数据库映射并连接MySQL数据库,有两种分类四个方式如下
其中来自数据库的EF设计器和来自数据库的Code First选项是将数据库表信息导入Visual Studio,创建时需要连接数据库并指定要导入的表(实体)信息生成模型
来自数据库的EF设计器模式生成的模型,可以看到和数据库里的表结构是一致的
User.cs
是向导根据数据库自动生成的User
类,UserModel.Context.cs
文件里包含的TestEntities类是向导生成的数据上下文类,该类用于映射数据库,在控制器中对数据模型进行操作时都要先对其实例化,name=TestEntities
是连接数据库字符串的名称
该项下模型代码根据EF设计自动生成,即所谓的DataFirst模式
此时Web.Config内新增了如下连接信息,metadata参数的意思是加载所有目录下的.csdl、ssdl、msl文件,详见【参考文章】
<connectionStrings> <add name="testEntities" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=root;password=test;database=test"" providerName="System.Data.EntityClient" /> connectionStrings>
来自数据库的CodeFirst生成了两个文件
Models2.cs
和user.cs
,该模式下直接生成模型代码及数据库关系定义
此时Web.Config内新增如下连接信息:
<connectionStrings> <add name="Model22" connectionString="server=localhost;user id=root;password=test;database=test" providerName="MySql.Data.MySqlClient" /> connectionStrings>
**这两个选项都需要先在数据库中定义好表关系,Visual Studio 中模型由数据库生成
空 EF 设计模型 和 空 Code First 模型则是先在Visual Studio中创建EF设计或模型代码定义,然后再导入生成数据库表及关系
空 EF 设计模型 会生成一个空的EF设计器相关文件,此时在Visual Studio中通过可视化界面设计定义EF设计,然后根据当前EF设计生成模型代码并同步到数据库,例如以下步骤
空 Code First 模型 可以理解为正常使用代码定义一个数据关系模型,然后同步到数据库表中, 新建后会自动生成一个文件
Modelsx.cs
,Modelsx类继承了DbContext,可在手动新建一个代码文件并定义模型类(例如use.cs)(推荐新建文件,也可根据自动生成的代码示例直接定义在Modelsx中)
如下新建该项后Web.Config中新增如下信息:
<add name="ModelTest" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=WebApplication1.Models.Modelsx;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
name=ModelTest
指定了当前连接关联的模型,需要修改这个配置以正确连接并更新代码模型到MySQL数据库中,观察connectionString内容,其中
data source
定义了数据库的连接信息**initial catalog
定义了数据库初始化信息,此处的值指定了数据库初始化时的名称,而非初始化时加载代码providerName
指定了需要关联的数据库驱动integrated security
集成验证,使用Windows验证的方式去连接到数据库服务器,不是必须的MultipleActiveResultSets
的作用是指定多活动的结果集是否与指定的链接相互关联,可以使数据库连接复用减轻系统的负担,不是必须的App=EntityFramework
不是必须的将
connectionString
修改为如下内容
<add name="ModelTest" connectionString="server=localhost;user id=root;password=test;database=testdb;charset=utf8;initial catalog=testdb;" providerName="MySql.Data.MySqlClient" />
根据
ModelTest.cs
和use.cs
定义TestController.cs
代码,如在ModelTest
中定义方法用来操作数据库use表
public ModelTest() : base("name=uses") { public DbSet
uses { get; set; } } 在
TestController
中定义
public ActionResult Index() { ModelTest modelTest = new ModelTest(); uselist = modelTest.uses.toList(); return View('MyUsesView', uselist); }
则当浏览localhost:*/Test时,服务器代码会自动在MySQL中创建testdb数据库并在testdb中创建uses表。