DB First模式的创建
在这里,我们将以database-first的方法为现有数据库创建一个Entity Data Model(实体数据模型)(EDM),并了解基本的构建块。
Entity Framework使用EDM进行所有与数据库相关的操作。Entity Data Model是描述实体及其之间关系的模型。让我们使用Visual Studio(2012\2015\2017)和Entity Framework 6为学校数据库创建一个简单的EDM。
1、打开Visual Studio并创建一个控制台项目。
进入项目菜单->{项目名称}属性…-并确保项目的目标框架是. net framework 4.5,如下所示。
2、现在,通过右键单击解决方案资源管理器中的项目-> 添加-> 新建项目 来添加实体数据模型。这将打开“添加新项目”弹出框。在弹出窗口中,选择 ADO.NET实体数据模型,并为EDM提供适当的名称(在本例中为’School’),然后单击Add按钮。
3、Visual Studio中的实体数据模型向导(2012/2015/2017)打开,有四个选项可供选择:**EF Designer from database(来数据库的EF设计器)**用于数据库优先方法,**Empty EF Designer model(空EF设计器模型)**用于模型优先方法,Empty Code First model(空Code First模型)和Code First from database(来自数据库的Code First)。我们在这里使用EF Designer from database,因此从数据库选项中选择EF设计器并单击Next。
4、在这一步中,您需要创建一个与现有数据库的连接。如果这是您第一次为数据库创建EDM,那么您需要通过单击new connection…按钮。
在Connection Properties弹出窗口中,提供服务器名( . 为本地数据库),并选择您的数据库名称并单击OK按钮。
这将在app.config文件中添加一个Entities的连接字符串。设置DB connection后单击Next。
5、在这一步中,您需要选择Entity Framework的版本。我们将在基本教程中使用Entity Framework 6.0,因此选择Entity Framework 6.0,然后单击下一步。
注意:如果你已经使用NuGet管理器安装了最新版本的Entity Framework,那么这一步的向导将不再出现。
6、下一步将显示数据库中的所有表、视图和存储过程(SP)。选择所需的表、视图和sp,保持默认复选框选中,然后单击Finish。如果您愿意,您可以更改模型命名空间名称。
注意:
Pluralize or singularize generated object names(确定所生成对象名称的单复数形式):如果数据库中的表名为复数,则将实体集名称变为复数。例如,如果SchoolDB数据库包含Students表名,则实体集将是单数Student;如果SchoolDB数据库包含Student表名,则实体集将是单数Students。类似地,如果表与其他表具有一对多或多对多的关系,则模型之间的关系将被多元化。例如,Student表与Course表具有多对多关系,因此Student实体集将为Course类型的集合导航属性具有复数名称Courses。
Include foreign key columns in the model(在模型中包含外键列):包括显式表示外键的外键属性。例如,Student表与Standard表有一对多的关系。为了在模型中表示这一点,Student实体集包含了一个带有Standard引用导航属性的StandardId属性。如果该复选框未选中,那么它将只包括Standard引用导航属性,而不包括StandardId。
Import selected stored procedures and functions into entity model(将所选存储过程和函数导入到实体模型中):自动为存储过程和函数创建“函数导入”。你不需要像Entity Framework 6.0之前那样手动导入函数。
7、点击完成后,一个School.edmx文件将添加到您的项目中。
双击School.edmx打开EDM设计器。这将显示所选表的所有实体以及它们之间的关系,如下所示:
EDM在App.config文件中添加了提供程序和连接字符串设置,如下所示:
<?xml version="1.0"?><configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
</providers>
</entityFramework>
<connectionStrings>
<add name="SchoolDBEntities" connectionString="metadata=res://*/SchoolDB.csdl|res://*/SchoolDB.ssdl|res://*/SchoolDB.msl;provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=SchoolDB;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
因此,您可以为现有数据库创建一个实体数据模型文件(.edmx)。
您可以在XML视图中打开EDM设计器,在XML视图中可以看到EDM的所有三个部分:概念模式(CSDL)、存储模式(SSDL)和映射模式(MSL)。
右击School.edmx ->点击“打开…,这将打开一个弹出窗口。
在弹出窗口中选择“XML(文本)编辑器”。
Visual Studio不能同时在Design视图和XML格式中显示模型,因此您将看到一条消息,询问是否可以关闭模型的Design视图,单击Yes。这将打开XML格式视图。通过切换所有概要,您可以看到以下XML视图,如下所示。
您可以在这里看到SSDL内容、CSDL内容和C-S映射内容。如果展开SSDL和CSDL,每个模式节点下都有一些公共XML节点。您不需要编辑xml数据,因为这可以在Model Browser中更容易地完成。
现在,让我们检查生成的EDM (School.edmx)的所有构建块,如上图所示。
Entity-Table Mapping
EDM中的每个实体都映射到数据库表。您可以通过右键单击EDM设计器中的任何实体->选择表映射来检查实体-表映射。此外,如果您从设计器更改实体的任何属性名称,则表映射将自动反映该更改。
Context & Entity Classes
每个实体数据模型为每个数据库表生成一个上下文和一个实体类。在解决方案资源管理器中展开.edmx文件并打开两个重要文件.Context.tt和.tt,如下图所示:
School.Context.tt:每当您更改实体数据模型(.edmx文件)时,这个T4模板文件都会生成上下文类。展开School.Context.tt可以看到上下文类文件。上下文类位于.context.cs文件中。默认的上下文类名称是Entities。例如,SchoolDB的上下文类名是SchoolDBEntities,派生自DBContext类。
School.tt:School.tt是一个T4模板文件,它为每个DB表生成实体类。实体类是POCO(普通CLR对象)类。下面的代码片段显示了Student实体。
public partial class Student
{
public Student()
{
this.Courses = new HashSet<Course>();
}
public int StudentID { get; set; }
public string StudentName { get; set; }
public Nullable<int> StandardId { get; set; }
public byte[] RowVersion { get; set; }
public virtual Standard Standard { get; set; }
public virtual StudentAddress StudentAddress { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/