创建DbContext

时间:2021-12-27 21:47:30

返回总目录《一步一步使用ABP框架搭建正式项目系列教程》


上一篇介绍了《创建实体》,这一篇我们顺其自然地介绍《创建DbContext》。

温故:

提到DbContext,对于经常使用DbFirst模式的开发者来说已经再熟悉不过了,EntityFramework全靠这员大将。它的作用是代表与数据库连接的会话,提供了查询、状态跟踪、保存等功能。

还有一个重要的对象是DbSet,对实体类型提供了集合操作,比如Add、Attach、Remove。继承了DbQuery,所以可以提供查询功能。

知新:

ABP框架为我们创建了一个DbContext模板。这个模板就是我项目中基础设施层的ChargeStationDbContext.cs文件(当然,如果你的项目名称是XX,那么它的名字就是XXDbContext.cs),如下图:

创建DbContext

开干:

双击打开这个文件开始编辑。

创建DbContext

打开文件之后,发现有个todo提示,这个提示告诉我们“为你的实体们定义IDbset”。好,接下来,我们就在这个地方来定义以下代码。

        public virtual IDbSet<Cities> Cities { set; get; }
public virtual IDbSet<CoinsCollectionDataLogs> CoinsCollectionDataLogs { set; get; }
public virtual IDbSet<DeviceCoinsRecords> DeviceCoinsRecords { set; get; }
public virtual IDbSet<DeviceNoDataSets> DeviceNoDataSets { set; get; }
public virtual IDbSet<MoneyBoxRecycleRecords> MoneyBoxRecycleRecord { set; get; }
public virtual IDbSet<MonthEndReports> MonthEndReports { set; get; }
public virtual IDbSet<Operators> Operators { set; get; }
public virtual IDbSet<Orders> Orders { set; get; }
public virtual IDbSet<Provinces> Provinces { set; get; }
public virtual IDbSet<RefundOrders> RefundOrders { set; get; }
public virtual IDbSet<Stations> Stations { set; get; }
public virtual IDbSet<TerminalAlertLogs> TerminalAlertLogs { set; get; }
public virtual IDbSet<TerminalDevices> TerminalDevices { set; get; }
public virtual IDbSet<TerminalMaintainLogs> TerminalMaintainLogs { set; get; }
public virtual IDbSet<TransDetails> TransDetails { set; get; }

再次注意一下这里的提示“为你的实体们定义IDbset”,因为我的实体中还定义了Abp开头的一些Users和Roles等等,所以我在这里继续定义它们的IDbSet。定义之后,发

现报错,原话是这样的:“The key word ‘new’is required on ‘Roles’because it hides property IDbSet<TRole> AbpZeroDbContext<TTenant, TRole, TU

ser>”,翻译成人话就是说“父类中已经有这个属性了,如果你还要定义的话,就必须加一个new关键字来隐藏父类的同名属性”。可见,父类中已经定义了关于租户,用户和

角色等的属性,那么我们直接用就好了。来看看ABP module-Zero中的源码:

创建DbContext

ABP已经帮我们做了这么多,这就是它强大之所在啊。因而,推断出这里我们不用再定义这些东西的IDbSet了,只需定义自己业务的实体,相应地,之前(上一篇)创建的这些实体也应该删除了。

好了,这里我们定义完了IDbSet,那么AbpZeroDbContext是怎么连接到数据库的呢?它的连接字符串在哪呢?

注意看该类的构造函数,它调用了父类的构造函数,并且将“Default”字符串传给父类的构造函数。实际上,这个字符串一直从AbpZeroDbContext类传给其父类AbpContext,再向上传给父类DbContex,用于数据库的连接使用。最后通过读取Web.Config中name属性的值为“Default”的连接字符串来连接数据库。

<connectionStrings>
<add name="Default" connectionString="Server=localhost; Database=ChargeStation; Trusted_Connection=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

好了,今天的《创建DbContext》就说到这里,肚子饿了,该去做午饭了!下一篇我们聊《创建数据库迁移》,让我们一小步一小步地揭开ABP框架的神秘面纱,敬请关注!