在开发过程中,并不总是需要在现有项目中添加EntityFramework (EF)。但每当需要创建新项目或在现有项目中添加EF支持时,决定记录下这些步骤。本文将展示如何开始使用EntityFramework。将从一个不支持EntityFramework的项目开始,并添加EF支持到项目中,并使用迁移来更新数据库。使用的是Visual Studio 2017,MSSQL Server与SQL Server Management Studio以及EntityFrameworkCore与.NET CoreSDK 2.2。
首先,在Visual Studio中创建一个空的解决方案,并添加一个针对.NET Core2.2的WebAPI项目。使用的是MSSQL Server,因此正在寻找名为'Microsoft.EntityFrameworkCore.SqlServer'的Nuget包。右键单击项目,然后单击'管理NuGet包'并选择当前最新的稳定版本,即2.2.6。
将使用代码优先迁移,因此,还将添加对'Microsoft.EntityFrameworkCore.Design'的引用。将更新appsetting.json文件以添加连接字符串。使用的是本地机器上可用的MS SQLServer。将连接命名为'DefaultConnection',数据库名称为'ApplicationDb'。将通过添加以下内容来更新appsetting.json文件:
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;"
}
将组织与Entity Framework相关的代码到一个单独的文件夹中。因此,在项目中添加了一个名为'DBContext'的文件夹。接下来,将使用代码优先方法添加数据库中的表。
将添加三个表,分别是Customer、Contact和CustomerContact。代码示例显示了两个额外的类,IAuditable和Audit。Audit表的目的是存储所有表中发生的变更历史,而IAuditable是一个接口,用于统一Auditable属性。这些是额外的工作,目前可以忽略。还有一些枚举,用于为客户数据提供类型信息。
Customer和Contact实体具有多对多的关系,因此添加了CustomerContact实体来存储关系。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AutotrackEntityChange.DBContext
{
public class Customer : IAuditable
{
public Guid Id { get; set; }
public String AccountNumber { get; set; }
public String Name { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? ModifiedDate { get; set; }
public String LastModifiedBy { get; set; }
public bool IsInactive { get; set; }
public ICollection CustomerContacts { get; set; }
}
public class Contact : IAuditable
{
public Guid Id { get; set; }
public String Name { get; set; }
public String Title { get; set; }
public String Phone { get; set; }
public String Email { get; set; }
public ContactTypeEnum ContactType { get; set; }
public String Note { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? ModifiedDate { get; set; }
public String LastModifiedBy { get; set; }
public bool IsInactive { get; set; }
public ICollection CustomerContacts { get; set; }
}
public class CustomerContact:IAuditable
{
public Guid Id { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? ModifiedDate { get; set; }
public string LastModifiedBy { get; set; }
public bool IsInactive { get; set; }
public Guid CustomerId { get; set; }
public Customer Customer { get; set; }
public Guid ContactId { get; set; }
public Contact Contact { get; set; }
}
public class Audit
{
public Guid Id { get; set; }
public Guid? EntityId { get; set; }
public string User { get; set; }
public String Entity { get; set; }
public DateTime DateTime { get; set; }
public string ColumnName { get; set; }
public String OldValue { get; set; }
public String NewValue { get; set; }
public EntityStateChangeTypeEnum ChangeType { get; set; }
}
interface IAuditable
{
Guid Id { get; set; }
DateTime? CreatedDate { get; set; }
DateTime? ModifiedDate { get; set; }
String LastModifiedBy { get; set; }
bool IsInactive { get; set; }
}
public enum EntityStateChangeTypeEnum
{
Added,
Deleted,
Modified,
}
public enum ContactTypeEnum
{
Primary,
Secondary,
Emergency,
}
}
有了这些,就可以继续添加模型了。创建了一个名为ApplicationDbContext的类,该类派生自DbContext以配置EntityFramework。在这个类中,首先定义了所有三个表作为DbSet,并添加了一个public构造函数,将DbContext连接到数据库。
using Microsoft.EntityFrameworkCore;
namespace AutotrackEntityChange.DBContext
{
public class ApplicationDbContext: DbContext
{
public DbSet Customers { get; set; }
public DbSet Contacts { get; set; }
public DbSet CustomerContacts { get; set; }
public DbSet Audits { get; set; }
public ApplicationDbContext(DbContextOptions options) : base(options) {}
}
}
由于使用的是SQLServer,在startup类中的ConfigureServices中添加了sqlserver选项,引用了上面创建的ApplicationDbContext。
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
有了上述更改,准备使用Entity Framework创建迁移。在Visual Studio的包管理器控制台中,运行以下命令:
Add-Migration InitialCreate
命令运行后,迁移已被创建。这将在解决方案资源管理器中显示。迁移文件夹包含迁移文件和设计文件。这些内容可以在代码库中查看。简而言之,迁移是数据库的指令,在本例中,是创建表和关系。
现在迁移已经添加,可以更新数据库,以便应用迁移。为此,在包管理器控制台中运行以下命令:
Update-database