EFCore 之 Entity继承
时间:2021-08-06
本文章向大家介绍EFCore 之 Entity继承,主要包括EFCore 之 Entity继承使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
官网示例
https://docs.microsoft.com/zh-cn/ef/core/modeling/inheritance
entity 定义
#region entity for Inherit
public class Animal
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Dog : Animal
{
public double Speed { get; set; }
}
public class Cattle : Animal
{
public double PhysicalStrength { get; set; }
}
#endregion entity for Inherit
DbContext 实现类
说明
- 输出日志到控制台
- 使用鉴别器(HasDiscriminator)配置所有继承类以及父类,并初始化
- migration时会在table中添加这个鉴别器字段(animal_type)
public class DataDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql("Server=localhost;Port=5432;Database=npgsql_demo;UID=postgres;PWD=********").LogTo(Console.WriteLine);
base.OnConfiguring(optionsBuilder);
}
public DbSet<Animal> Animals { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Animal>()
.HasDiscriminator<int>("animal_type")
.HasValue<Animal>(0)
.HasValue<Dog>(1)
.HasValue<Cattle>(2);
base.OnModelCreating(modelBuilder);
}
}
初始化数据
private void Init()
{
if (!context.Animals.Any())
{
context.Animals.Add(new Dog
{
Id = 1,
Name = "拉布拉多",
Speed = 70
});
context.Animals.Add(new Cattle
{
Id = 2,
Name = "荷斯坦牛",
PhysicalStrength = 500
});
context.Animals.Add(new Animal
{
Id = 3,
Name = "外星人"
});
context.SaveChanges();
}
}
分类查询
说明
- pgsql 区分大小写 使用 "" 包裹
- 日志那个颜色是截图时win带的荧光笔
protected override void Action()
{
var animals = context.Animals.ToList();
System.Console.WriteLine($"all animals : {JsonSerializer.Serialize(ConvertObject(animals), options)} \n");
var dogAndCattle = context.Animals.FromSqlRaw("select * from \"Animals\" where animal_type = 1 or animal_type = 2").ToList();
System.Console.WriteLine($"dog and cattle: {JsonSerializer.Serialize(ConvertObject(dogAndCattle), options)} \n");
var dogs = context.Set<Dog>().ToList();
System.Console.WriteLine($"dog : {JsonSerializer.Serialize(dogs, options)} \n");
var cattles = context.Set<Cattle>().ToList();
System.Console.WriteLine($"cattle : {JsonSerializer.Serialize(cattles, options)} \n");
}
private static IEnumerable<dynamic> ConvertObject(IEnumerable<Animal> animals)
{
foreach (var animal in animals)
{
if (animal is Dog dog)
yield return dog;
else if (animal is Cattle cattle)
yield return cattle;
else
yield return animal;
}
}
个人总结
- 也可以通过数据库view实现,但是创建了多张表
- 这里只写的简单的操作,更多功能(如:不同子类相同字段映射表单个字段) 请移步到官网
原文地址:https://www.cnblogs.com/chilli-with-fish/p/15108128.html
- 2301: [HAOI2011]Problem b
- mysql相关命令
- mac python3 安装 mysqlclient包失败如何解救
- SQL Server 深入解析索引存储(上)
- 1475: 方格取数
- python3 将字典,列表等转换成字符串形式存入mysql数据库并复原成字典,列表(处理稍复杂的格式)
- 1441: Min
- 2429: [HAOI2006]聪明的猴子
- 使用apt-get 安装后的mysql 登录问题
- SQL Server 深入解析索引存储(中)
- 1789: [Ahoi2008]Necklace Y型项链
- 3399: [Usaco2009 Mar]Sand Castle城堡
- 遗传算法(1)
- LOJ#6284. 数列分块入门 8
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android EditText密码的隐藏和显示功能
- linux系统下的时间配置综述
- Android TextView 去掉自适应默认的fontpadding的实现方法
- Linux文件/目录的权限及归属管理使用
- Android自定义环形LoadingView效果
- Android隐藏标题栏及解决启动闪过标题的实例详解
- Linux使用sed命令替换字符串教程
- Android实现获取短信验证码并自动填写功能
- Android 定时器实现图片的变换
- Android 软键盘状态并隐藏输入法的实例
- Linux磁盘管理之LVM的使用
- Android编程之菜单Menu的创建方法示例
- Ubuntu下Docker CE的安装
- 基于Android自定义控件实现雷达效果
- Android 中 onSaveInstanceState()使用方法详解