EFCore代码实践
参考:https://www.cnblogs.com/Wddpct/p/6835574.html
控制台程序依赖注入参考:https://www.cnblogs.com/Wddpct/p/7219205.html
1、模型定义
namespace Domain
{
public class Blog
{
public Blog()
{
Posts = new List<Post>();
}
public int BlogId { get; set; }
public string Url { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public DateTime CreateTime { get; set; }
public virtual List<Post> Posts { get; set; } public void AddPsot(Post post)
{
if (Posts == null)
{
Posts = new List<Post>();
} Posts.Add(post);
}
}
}
namespace Domain
{
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
}
2、数据访问
using Domain;
using Microsoft.EntityFrameworkCore;
using System; namespace CoreEfDAL
{
public class ForumContext : DbContext
{
public ForumContext(DbContextOptions<ForumContext> options)
: base(options)
{ } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Blog>().Property(b => b.Url).HasMaxLength();
modelBuilder.Entity<Blog>().Property(b => b.Title).HasMaxLength();
modelBuilder.Entity<Blog>().Property(b => b.Author).HasMaxLength(); modelBuilder.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(b => b.Blog);
} public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
3、单元测试
using CoreEfDAL;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.EntityFrameworkCore.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Domain;
using System;
using System.IO; namespace CoreEfDAL_Test
{
[TestClass]
public class UnitTest1
{
private ForumContext GetDB()
{
ConfigurationBuilder cfgBuilder = new ConfigurationBuilder();
cfgBuilder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json"); var configuration = cfgBuilder.Build();
var conString = configuration.GetConnectionString("myblog"); var serviceCollection = new ServiceCollection();
serviceCollection.AddDbContext<ForumContext>(c => c.UseSqlServer(conString)); var db = serviceCollection.BuildServiceProvider().GetService<ForumContext>();
return db;
} [TestMethod]
public void AddBolgs_Test()
{
var db = GetDB();
var blog = new Blog {
Url = "http://blogs.msdn.com/adonet",
Title = "测试标题121212111", Author = "王五",
CreateTime = DateTime.Now }; var post1 = new Post();
post1.Content = "ddddddd";
post1.Title = "tttttttt"; var post2 = new Post();
post2.Content = "dddxxxxdddd";
post2.Title = "ttttddddd"; var post3 = new Post();
post3.Content = "2345sdfsd";
post3.Title = "dghdfghfgh"; blog.AddPsot(post1);
blog.AddPsot(post2);
blog.AddPsot(post3); db.Blogs.Add(blog);
var count = db.SaveChanges();
Console.WriteLine("{0} records saved to database", count);
}
}
}
基于内存数据库的测试
[TestMethod]
public void AddDepartment_Test()
{
var options = new DbContextOptionsBuilder<PortalContext>()
.UseInMemoryDatabase(databaseName: "portaldb")
.Options; using (var context = new PortalContext(options))
{
Department dp = new Department();
dp.Id = "";
dp.Name = "根目录";
dp.ParentId = "";
dp.IsDeleted = false; context.Departments.Add(dp);
var count = context.SaveChanges();
Console.WriteLine("{0} records saved to database", count); var d = context.Departments.Find("");
Console.WriteLine(d.Name);
}
}
4、API调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreEfDAL;
using Domain;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json; namespace CoreEfWeb.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BlogsController : ControllerBase
{
private readonly ForumContext _dbContext;
public BlogsController(ForumContext dbContext)
{
_dbContext = dbContext;
} private JsonResult Json(object data)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MaxDepth = ;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //忽略循环引用
return new JsonResult(data, settings);
} [HttpGet]
public JsonResult Get()
{
var blogs = _dbContext.Blogs.Include(b => b.Posts).ToList();
return Json(blogs);
} [HttpGet("{id}")]
public JsonResult Get(int id)
{
var blog = _dbContext.Blogs.Include(b => b.Posts).FirstOrDefault(b => b.BlogId == id);
return Json(blog);
} [HttpPost]
public void Post([FromBody] Blog blog)
{
_dbContext.Blogs.Add(blog);
_dbContext.SaveChanges();
} [HttpPut("{id}")]
public void Put(int id, [FromBody] Blog blog)
{
var blogDomain = _dbContext.Blogs.FirstOrDefault(b => b.BlogId == id);
if (blogDomain != null)
{
blogDomain.Title = blog.Title;
blogDomain.Author = blog.Author;
blogDomain.Url = blog.Url;
_dbContext.SaveChanges();
}
} [HttpPut("{id}/author")]
public void Put(int id, [FromBody] ModifyBlogAuthorRequest request)
{
var blogDomain = _dbContext.Blogs.FirstOrDefault(b => b.BlogId == id);
if (blogDomain != null)
{
blogDomain.Author = request.NewAuthor;
blogDomain.CreateTime = DateTime.Now;
_dbContext.SaveChanges();
}
} [HttpDelete("{id}")]
public void Delete(int id)
{
var blogDomain = _dbContext.Blogs.FirstOrDefault(b => b.BlogId == id);
if (blogDomain != null)
{
_dbContext.Blogs.Remove(blogDomain);
_dbContext.SaveChanges();
}
}
} public class ModifyBlogAuthorRequest
{
public string NewAuthor { get; set; }
}
}
5、其他
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using CoreEfDAL;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json; namespace CoreEfWeb
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ForumContext>(c => c.UseSqlServer(Configuration.GetConnectionString("myblog")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} app.UseHttpsRedirection();
app.UseMvc();
}
}
}
appsettings.json 文件
{
"ConnectionStrings": {
"myblog": "server=.;uid=sa;pwd=sa123456;database=efcoretest"
}
}
迁移命令
Add-Migration init --迁移
Updata-Database --更新数据库
EFCore代码实践的更多相关文章
- ReactiveCocoa代码实践之-更多思考
三.ReactiveCocoa代码实践之-更多思考 1. RACObserve()宏形参写法的区别 之前写代码考虑过 RACObserve(self.timeLabel , text) 和 RACOb ...
- ReactiveCocoa代码实践之-RAC网络请求重构
前言 RAC相比以往的开发模式主要有以下优点:提供了统一的消息传递机制:提供了多种奇妙且高效的信号操作方法:配合MVVM设计模式和RAC宏绑定减少多端依赖. RAC的理论知识非常深厚,包含有FRP,高 ...
- 深刻理解Python中的元类(metaclass)--代码实践
根据http://blog.jobbole.com/21351/所作的代码实践. 这篇讲得不错,但以我现在的水平,用到的机会是很少的啦... #coding=utf-8 class ObjectCre ...
- Java的BIO和NIO很难懂?用代码实践给你看,再不懂我转行!
本文原题“从实践角度重新理解BIO和NIO”,原文由Object分享,为了更好的内容表现力,收录时有改动. 1.引言 这段时间自己在看一些Java中BIO和NIO之类的东西,也看了很多博客,发现各种关 ...
- TextCNN代码实践
在上文<TextCNN论文解读>中已经介绍了TextCNN的原理,本文通过tf2.0来做代码实践. 数据集:来自中文任务基准测评的数据集IFLYTEK 导库 import os impor ...
- word2vector代码实践
引子 在上次的 <word2vector论文笔记>中大致介绍了两种词向量训练方法的原理及优劣,这篇咱们以skip-gram算法为例来代码实践一把. 当前教程参考:A Word2Vec Ke ...
- 机器学习(四):通俗理解支持向量机SVM及代码实践
上一篇文章我们介绍了使用逻辑回归来处理分类问题,本文我们讲一个更强大的分类模型.本文依旧侧重代码实践,你会发现我们解决问题的手段越来越丰富,问题处理起来越来越简单. 支持向量机(Support Vec ...
- .net core web api + Autofac + EFCore 个人实践
1.背景 去年时候,写过一篇<Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统>,采用Asp.net Web API + Element-UI.当时主要是为了 ...
- ReactiveCocoa代码实践之-UI组件的RAC信号操作
上一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜 ...
随机推荐
- go中interface空指针不为nil判断方法
interface空指针不为nil 当把一个空指针对象赋值给一个interface后,再判断!= nil就不再成立了 代码如下 package main import "fmt" ...
- JPA技术之EntityManager使用方法
Session bean or MD bean对Entity bean的操作(包括所有的query, insert, update, delete操作)都是通过EntityManager实例来完成的. ...
- webpack4 code splitting
demo 代码点此,webpack4 进行 code splitting 使用 split-chunks-plugin, 开始前先做点准备工作. start 安装: npm i -D webpack ...
- CTF挑战赛丨网络内生安全试验场第一季答题赛火热开启
前期回顾:挑战世界级“人机大战”,更有万元奖金等你来拿 网络内生安全试验场自上线以来,受到了业内的极大重视与关注. 自9月2日报名通道开启后,报名量更是持续高升,上百名精英白帽踊跃报名. 至此,网络内 ...
- 用实力燃爆暑期丨i春秋渗透测试工程师线下就业班开课了!
i春秋&赛虎暑期渗透测试工程师线下就业班开课了! 本期开班地点:北京,面授脱产:四个月. 如果这次没来得及报名的同学也可以选择9月份广州的班次,具体开班时间请咨询谢老师:18513200565 ...
- APS系统生产流转方式和批量算法研究
01.前言 在经济领域,生产型企业是经济的根基,有了生产型企业生产出的各种产品,才有物流.网上购物和金融融资等活动.对于生产型企业,其制造能力是其核心竞争力.如何提升制造能力一直是生产型企业面临的课题 ...
- Android不显示开机向导和开机气泡
修改好的代码下载地址: https://github.com/Vico-H/Launcher 不显示开机向导 修改Launcher2.java的代码 (文件位置: /alps/packages/app ...
- du查看某个文件或目录占用磁盘空间的大小
一.du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory ...
- 【转】面试还搞不懂redis,快看看这40道Redis面试题(含答案和思维导图)
———————————————— 版权声明:本文为CSDN博主「程序员追风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- vsftpd服务
vsftpd服务 文件传输协议(file transfer protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件,上传文件,下载文件.ftp基于TCP协议生成一个虚拟的连接,主要 ...