说明:搭建netcore 使用efcore入门教程,跟着这个教程,傻瓜都可以成功!O(∩_∩)O哈哈~,咱们开始吧;

首先介绍下环境:

  vs2017,

  netcore2.2,

  EntityFramework6

  测试场景:Mysql,SqlServer

一、创建netcore模板项目

这个就不用多说了,创建完成看下版本:

二、引用EF Core

有的博主写的这样引用:Install-Package Microsoft.EntityFrameworkCore.Sqlite –Pre

但是,遗憾的是,报错了:

然后我自己引用了以包,OK

为了方便复制,我直接复制出来:

1.Microsoft.EntityFrameworkCore
2.Install-Package Microsoft.EntityFrameworkCore.Sqlite
3.Install-Package Microsoft.EntityFrameworkCore.Design
4.Install-Package Microsoft.EntityFrameworkCore.Tools

项目结构如下:

 三、创新测试的实体类

我这边创建了一个DBModel文件夹,然后分别创建了三个类:

OrderInfo.cs,

Passenger.cs,

Address.cs

为什么要创建这么几个呢:因为后续会设计到表之间关联关系,主键,外键,引用等等,当然,本文主要是入门,后面的文章会详细讲解;

(PS:关系:一个OrderInfo有一个Passenger和一个Address,一个Passenger又可以有多个OrderInfo和一个Address);

强调:需要引用MySql.Data.EntityFrameworkCore

OrderInfo.cs

[MySqlCharset("utf8mb4")] //字符集,需要引用MySql.Data.EntityFrameworkCore
[MySqlCollation("utf8mb4_general_ci")] //排序规则
[Table("orderinfo", Schema = "manager")]
public class OrderInfo { [JsonProperty("id")]
[Required]
[Column("id", TypeName = "int(11)")]
public int Id { get; set; } /// <summary>
/// 订单Id
/// </summary>
[JsonProperty("order_id")]
[Required]
[Column("order_id", TypeName = "int(11)")]
public int OrderId { get; set; } [JsonProperty("passengerid")]
[Column("passenger_id",TypeName ="int(11)")]
public int PassengerId { get; set; } [JsonProperty("addressid")]
[Column("address_id", TypeName = "int(11)")]
public int AddressId { get; set; } /// <summary>
/// 订单价格
/// </summary>
[StringLength(maximumLength: )]
[Column("price")]
public string Price { get; set; } /// <summary>
/// 订单客人信息
/// </summary>
[ForeignKey("PassengerId")]
public Passenger OrderForPassenger { get; set; } ///// <summary>
///// 订单地址信息
///// </summary>
//[InverseProperty("OrderInfos")]
//public Address OrderForAddress { get; set; }

  

  

Passenger.cs

 [MySqlCharset("utf8mb4")] //字符集,需要引用MySql.Data.EntityFrameworkCore
[MySqlCollation("utf8mb4_general_ci")] //排序规则
[Table("passenger", Schema = "manager")]
public class Passenger { [JsonProperty("id")]
[Column("id", TypeName = "int(10)")]
public int Id { get; set; } [JsonProperty("passenger_id")]
[Column("passengerid",TypeName ="int(11)")]
public int PassengerId { get; set; } [JsonProperty("passengername")]
public string PassengerName { get; set; } [InverseProperty("OrderForPassenger")]
public List<OrderInfo> OrderInfos { get; set; } //[InverseProperty("Passengers")]
//public Address PssengerForAddress { get; set; }
}

  

Address.cs

 [MySqlCharset("utf8mb4")] //字符集,需要引用MySql.Data.EntityFrameworkCore
[MySqlCollation("utf8mb4_general_ci")] //排序规则
[Table("address", Schema = "manager")]
public class Address { [JsonProperty("id")]
[Required]
public int Id { get; set; } [JsonProperty("province")]
[StringLength(maximumLength: )]
public string Province { get; set; } [JsonProperty("city")]
[StringLength(maximumLength: )]
public string City { get; set; } [JsonProperty("area")]
[StringLength(maximumLength: )]
public string Area { get; set; } [JsonProperty("street")]
[StringLength(maximumLength:)]
public string Street { get; set; }
}

  

 四、创建一个DataDBContext.cs类,代码如下

  public class DataDBContext:DbContext {
public DataDBContext(DbContextOptions<DataDBContext> options)
: base(options) { }
/// <summary>
/// 订单
/// </summary>
public DbSet<OrderInfo> OrderInfos { get; set; }
/// <summary>
/// 乘客
/// </summary>
public DbSet<Passenger> Passengers { get; set; } /// <summary>
/// 地址
/// </summary>
public DbSet<Address> Addresses { get; set; }
}

 

 五、创建数据库初始化和连接

为了方便测试,将数据库连接配置放在了appsettings.json文件中了。配置文件内容如下:

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionSetting": {
"UserConnectionString": "server=localhost;userid=root;pwd=123456;port=3306;database=manager",
"ReadConnectionString": "server=localhost;userid=root;pwd=123456;port=3306;database=manager",
"DbType": 0 //数据库类型
}
}

在StartUp.cs中注册连接:

  services.AddDbContext<DataDBContext>(optionsBuilder => {
var dataAppSetting = Configuration.GetSection("ConnectionSetting").Get<ConnectionSetting>();
if (dataAppSetting == null) {
throw new Exception("未配置数据库连接");
} switch (dataAppSetting.DbType) {
case :
//server连接,EnableRetryOnFailure表示失败支持重试;
optionsBuilder.UseSqlServer(dataAppSetting.UserConnectionString, option => option.EnableRetryOnFailure());
break;
default:
optionsBuilder.UseMySQL(dataAppSetting.UserConnectionString);
break;
}
});

这里可能有朋友会问一下,万一数据库没有创建怎么办?

所以,这里Configure方法加一下内容

context.Database.EnsureCreated();//数据库不存在的话,会自动创建

六、打开对应文件目录,执行

打开文件夹的命令行,

输入

  dotnet ef migrations add MyFirstMigration

  dotnet ef database update

这样我们就创建好了数据库。更多命令请 dotnet ef -h

可以看到,里面其实是执行了创建数据库表的sql语句!

那我,我们来看一下我数据库,结果如下:

有的朋友可能会问,为啥多了一个表:“_efmigrationshistory”,故名思义,这个表示执行操作的记录,因为可能对表增加字段,修改字段,删除字段等等;

当然只是一个记录:

运行完成之后,我们会发现,我们会多一个Migrations文件夹

里面的内容是什么呢,大家可以打开看看,下面是我的部分截图:

可以看到,这些都是我们之前创建实体时的一些属性,如果是第一次尝试的朋友也没有必要设置这么多。

七、测试效果 

简单写了个demo测试效果

话不多说,直接上代码:

Index.cshtml

@model IEnumerable<EfCoreDemo.DbModel.Address>

@{
ViewBag.Title = "地址";
}
<table class="table">
<tr>
<th>Id</th>
<th>省</th>
<th>市</th>
<th>区</th>
<th>街道详细地址</th>
</tr> @foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Province)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.Area)
</td>
<td>
@Html.DisplayFor(modelItem => item.Street)
</td>
</tr>
}
</table>

AddAddress.cshtml

@model EfCoreDemo.DbModel.Address
@{
ViewData["Title"] = "Address";
}
<form asp-controller="Address" asp-action="AddAddress" method="post">
<div class="form-group">
<label asp-for="Province" class="col-md-2 control-label">省:</label>
<div class="col-md-10">
<input class="form-control" asp-for="Province" />
<span asp-validation-for="Province" class="text-danger"></span>
</div>
<label asp-for="City" class="col-md-2 control-label">市:</label>
<div class="col-md-10">
<input class="form-control" asp-for="City" />
<span asp-validation-for="City" class="text-danger"></span>
</div>
<label asp-for="Area" class="col-md-2 control-label">区:</label>
<div class="col-md-10">
<input class="form-control" asp-for="Area" />
<span asp-validation-for="Area" class="text-danger"></span>
</div>
<label asp-for="Street" class="col-md-2 control-label">街道门牌号:</label>
<div class="col-md-10">
<input class="form-control" asp-for="Street" />
<span asp-validation-for="Street" class="text-danger"></span>
</div>
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="保存" class="btn btn-success" />
</div>
</div>
</form>

AddressController.cs

 public class AddressController : Controller
{
private DataDBContext _context; public AddressController(DataDBContext context) {
_context = context;
}
public IActionResult Index()
{
return View(_context.Addresses.ToList());
} public IActionResult AddAddress() {
return View();
} [HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddAddress(Address address) {
if (ModelState.IsValid) {
_context.Addresses.Add(address);
_context.SaveChanges(); return RedirectToAction("Index");
} return View(address);
}

运行效果:

至此,初级版本搭建成功,且运行成功;

后记:本文主要是记录一下netcore怎么搭建efcore,只属于基础,自己学习的过程中也方便跟大家一起探讨,我们使用数据库的时候,不可能只有单独的几张表,

一般都会有主键,外键,索引,组合索引等等,

或者对表的操作,删除,修改,新增字段等等;

后续会继续更新更多的efcore的东西,如有问题,欢迎一起讨论。

感谢以下文章提供的启发:

参考博客:https://www.cnblogs.com/liangxiaofeng/p/5806347.html

参考文档:https://docs.microsoft.com/zh-cn/ef/core/get-started/netcore/new-db-sqlite

netcore使用EFcore(第一个实例)的更多相关文章

  1. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

  2. .NetCore中EFCore for MySql整理(二)

    一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...

  3. 【C# -- OpenCV】Emgu CV 第一个实例

    原文 [C# -- OpenCV]Emgu CV 第一个实例 Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜 ...

  4. Thrift教程初级篇——thrift安装环境变量配置第一个实例

    前言: 因为项目需要跨语言,c++客户端,web服务端,远程调用等需求,所以用到了RPC框架Thrift,刚开始有点虚,第一次接触RPC框架,后来没想到Thrift开发方便上手快,而且性能和稳定性也不 ...

  5. Konckout第一个实例:简单数据模型绑定

    Konck是什么: http://www.aizhengli.com/knockoutjs/50/knockout.html 使用:直接引入knockout.js文件 第一个实例:实现输入框输入值改变 ...

  6. .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql

    一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...

  7. Vue.js学习和第一个实例

    第一个实例效果图: 1.node.js下载,然后安装.下载地址:链接:http://pan.baidu.com/s/1o7TONhS 密码:fosa 2.下载Vue.js.链接:http://pan. ...

  8. Highmaps网页图表教程之Highmaps第一个实例与图表构成

    Highmaps网页图表教程之Highmaps第一个实例与图表构成 Highmaps第一个实例 下面我们来实现本教程的第一个Highmaps实例. [实例1-1:hellomap]下面来制作一个中国地 ...

  9. JAVA-MyEclipse第一个实例

    相关资料: <21天学通Java Web开发> 实例代码: MyEclipse第一个实例1.打开MyEclipse程序.2.在PacKage视图->右击->New|Web Pr ...

随机推荐

  1. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  2. Centos7搭建OpenNebula云平台

    OpenNebula概述 OpenNebula是专门为云计算打造的开源系统,用户可以使用Xen.KVM.VMware等虚拟化软件一起打造企业云.利用OpenNebula可以轻松构建私有云.混合云.公开 ...

  3. 【转载】 DeepMind发表Nature子刊新论文:连接多巴胺与元强化学习的新方法

    原文地址: baijiahao.baidu.com/s?id=1600509777750939986&wfr=spider&for=pc 机器之心 18-05-15   14:26 - ...

  4. 多重if结构

    package com.imooc; import java.util.Scanner; public class TypeExchange { public static void main(Str ...

  5. ES6深入浅出-3 三个点运算 & 新版字符串-2. 新版字符串

    这是以前的字符串..双引号,单引号.毫无区别 有时候在字符串里面写一些标签. 排版不好看 我就想回车一下.这样写虽然是好看.但是语法就报错了.es5的字符串不支持换行.我只想是想让它排版的好看一点. ...

  6. 软件定义网络基础---OF-Config协议

    交换机与控制器继续通信前,是需要对其功能.特性以及资源进行配置才能进行工作,这些配置是如何实现的?是由专门的配置协议指导完成的 一:OF-Config协议 是OpenFlow交换机管理配置协议,是Op ...

  7. k8s记录-flanneld+docker网络部署(四)

    1)程序准备tar xvf flannel-v0.10.0-linux-amd64.tar.gz mkdir -p /data/projects/common/kubernetes/{bin,cfg, ...

  8. Asynchronous Streaming Request Processing in Spring MVC 4.2 + Spring Boot(SpringBoot中处理异步流请求 SpringMvc4.2以上)

    With the release of Spring 4.2 version, Three new classes have been introduced to handle Requests As ...

  9. Windows2008R2+iis7.5环境下的dz论坛X3版伪静态设置教程

    Windows2008R2+iis7.5环境下的dz论坛X3版伪静态设置教程 因为2008R2不是那么的普及,加上X3版新出不久,所以伪静态的设置教程比较少,今天搞出来了,其实很简单,那么下面给大家简 ...

  10. APT攻击与银行

    APT与传统攻击 APT:团队作战,拥有自研工具集,意图明确,技术高超,拥有政府或商业背景,潜伏期多达数年. 传统攻击:脚本小子,水平参差不齐,短期攻击,直接获取利益为目标. 攻击目标 APT攻击链 ...