天天看点

使用控制台从0开始尝试Abp.EntityFramwork

引言

使用空白控制台复写一下

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

使用控制台从0开始尝试Abp.EntityFramwork

不清楚的可以参见我前面介绍的关于EF篇:

  • EFCore中代码优先锲约和数据类型与数据库的对应关系
  • efcore 一对一 一对多 多对多关系

7. 测试的效果:

使用控制台从0开始尝试Abp.EntityFramwork

8. 写在最后

本篇主要是对

Abp.vNext

中如何使用

EntityFramwork

做了一个从0搭建项目做一个简单的demo记录,只是使用到了一对一的展示,其他的就不再累述。

再就是

Abp.vNext

中还有很多的审计聚合根的使用,扩展属性等等,在设计Entity上也是DDD的思想,需要慢慢体会里面的思想以及韵味。