引言
使用空白控制台复写一下
Abp.vNEXT
中对
EF
的使用。
所依赖的包
- Volo.Abp.Data
- Volo.Abp.EntityFrameworkCore
- Volo.Abp.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools (为了使用dotnet ef/add-miration)
我这里默认选择SqlServer,其实Abp是支持很多种数据库的。
1. 添加Module
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace csblog_133043
{
public class CnBlogModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDbContextOptions>(options => options.UseSqlServer());
}
}
}
2. 添加实体
using System;
using System.Collections.Generic;
using System.Text;
namespace csblog_133043
{
public class Users
{
public int Id { get; set; }
public Users Referrer { get; set; }
}
public class Article
{
public int Id { get; set; }
public Article Next { get; set; }
public Article Previous { get; set; }
}
}
我这里只是简单的使用,其实Abp中还是有很多的审计聚合根,在领域设计中直接开放set也不是最佳实践。
3. 添加DbContextFactory
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace csblog_133043
{
public class CnBlog133043MigrationsContextFactory : IDesignTimeDbContextFactory<CnBlog133043Context>
{
public CnBlog133043Context CreateDbContext(string[] args)
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<CnBlog133043Context>()
.UseSqlServer(configuration.GetConnectionString("Default"));
return new CnBlog133043Context(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
}
}
ContextFactory是为了使用dotnet ef 或add-migration时返回对应的DbContext。
4. 创建DbContext
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace csblog_133043
{
[ConnectionStringName("Default")]
public class CnBlog133043Context : AbpDbContext<CnBlog133043Context>
{
public CnBlog133043Context(DbContextOptions<CnBlog133043Context> options)
: base(options)
{
}
public DbSet<Article> Articles { get; set; }
public DbSet<Users> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Users>(u=>
{
u.ToTable(nameof(Users));
u.ConfigureByConvention();
u.HasOne(n => n.Referrer).WithOne();
});
modelBuilder.Entity<Article>(a=>
{
a.ToTable(nameof(Article));
a.ConfigureByConvention();
a.HasOne(n => n.Next).WithOne();
a.HasOne(n => n.Previous).WithOne();
});
}
5. 添加appsettings
{
"ConnectionStrings": {
"Default": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=cnblog;Integrated Security=True"
}
}
.net core框架默认都会找ConnectionStrings
6. 开始Migration
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zdjxWMXlVc5YkYvh2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxYzMwIjNyIjM5ATMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
不清楚的可以参见我前面介绍的关于EF篇:
- EFCore中代码优先锲约和数据类型与数据库的对应关系
- efcore 一对一 一对多 多对多关系
7. 测试的效果:
8. 写在最后
本篇主要是对
Abp.vNext
中如何使用
EntityFramwork
做了一个从0搭建项目做一个简单的demo记录,只是使用到了一对一的展示,其他的就不再累述。
再就是
Abp.vNext
中还有很多的审计聚合根的使用,扩展属性等等,在设计Entity上也是DDD的思想,需要慢慢体会里面的思想以及韵味。