EF CORE中复杂类型的映射
实体映射时,遇到复杂类型,可选择下述方法处理:
- NotMapped,跳过映射
- 在复杂类型上声明 [Owned],但仅限该复杂类型是全部由简单值类型组成的
- 自定义序列化方法
示例: IPInfo使用了owned,对IPEndPoint使用自定义序列化,对VersionInfo使用JSON序列化
@@@code
public
class
Controller : IController
{
public
int SN { get; set; }
public IPInfo IPInfo { get; set; } = IPInfo.Default;
[Column(TypeName = "string")]
public VersionInfo VersionInfo { get; set; } = VersionInfo.Default;
[Column(TypeName = "string")]
public System.Net.IPEndPoint ServerIPEndPoint { get; set; } = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
public DateTime Time { get; set; } = DateTime.Now;
} [Owned]
public
class
IPInfo
{
public
static IPInfo Default { get; } = new IPInfo()
{
IP="192.168.0.254"
};
public
string IP { get; set; } public
ushort Port { get; set; } = 60000;
public
string Mac { get; set; }
public
string Mask { get; set; } = "255.255.255.0";
public
string Gateway { get; set; } = "192.168.0.1";
public
bool Force { get; set; } }
@@#
自定义序列化
@@@code public
class
IPEndPointConverter : ValueConverter<System.Net.IPEndPoint, string>
{
public
IPEndPointConverter(ConverterMappingHints mappingHints = null)
: base(
v => v.ToString(),
v => System.Net.IPEndPoint.Parse(v),
mappingHints)
{
} public
static ValueConverterInfo DefaultInfo { get; }
= new ValueConverterInfo(typeof(System.Net.IPEndPoint), typeof(string), i => new IPEndPointConverter(i.MappingHints));
}
public
class
JsonConverter<T> : ValueConverter<T, string>
{
public
JsonConverter() : this(null)
{ }
public
JsonConverter(ConverterMappingHints mappingHints = null)
: base(
v => v.SerializeObject(),
v => v.Deserialize<T>(),
mappingHints)
{
} public
static ValueConverterInfo DefaultInfo { get; }
= new ValueConverterInfo(typeof(T), typeof(string), i => new JsonConverter<T>(i.MappingHints));
} protected
override
void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
void aa<T>() where T : class
{
modelBuilder.Entity<T>().ToTable(typeof(T).Name.ToLower());
}
aa<User>();
aa<Device>(); foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{ foreach (var property in entityType.GetProperties())
{
if (property.ClrType.IsValueType && !property.ClrType.IsGenericType)
continue; switch (property.ClrType.Name)
{
case nameof(System.Net.IPEndPoint):
property.SetValueConverter(new IPEndPointConverter()); //演示 owned效果,仅限复杂类型是由简单类型组成的,没有内嵌复杂类型
break;
case nameof(String):
break;
default:
Type genType = typeof(JsonConverter<>).MakeGenericType(property.ClrType);
ValueConverter obj = Activator.CreateInstance(genType) as ValueConverter;
property.SetValueConverter(obj);
break;
} }
} }
@@#
EF CORE中复杂类型的映射的更多相关文章
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- EF Core中的多对多映射如何实现?
EF 6.X中的多对多映射是直接使用HasMany-HasMany来做的.但是到了EF Core中,不再直接支持这种方式了,可以是可以使用,但是不推荐,具体使用可以参考<你必须掌握的Entity ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解
EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...
- EF Core中通过Fluent API完成对表的配置
EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...
- [小技巧]EF Core中如何获取上下文中操作过的实体
原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- 9.4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-f ...
- EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况
使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...
随机推荐
- Java入门 - 面向对象 - 06.接口
原文地址:http://www.work100.net/training/java-interface.html 更多教程:光束云 - 免费课程 接口 序号 文内章节 视频 1 概述 2 接口的声明 ...
- [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- docker创建mysql容器,并挂载数据+配置
新建:/my/mysql/my.cnf (准备挂载配置文件用) 将以下内容拷贝进去(或者启动一个docker的mysql,并且把/etc/mysql/my.cnf中的内容拷贝出来) # Copyrig ...
- python3学习笔记一
install 安装软件包download 下载安装包uninstall 卸载安装包freeze 按照req uirements 格式输出安装包,可以到其他服务器上执行pip install -r r ...
- laravel脚手架搭建项目问题之生产环境element-ui组件字体图标显示错误问题
问题描述: 1.element-ui组件使用的是npm安装 2.npm scripe模式开发 3.使用git命令行工具开发 3.开发环境下图标正常显示 4.生产环境下图标显示不正常 分析原因: 图标文 ...
- Day8-Python3基础-Socket网络编程
目录: 1.Socket语法及相关 2.SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道 ...
- Ubuntu通过终端命令行换阿里源
检查Ubuntu系统的Codename $ lsb_release -a 得到结果: No LSB modules are available. Distributor ID: Ubuntu Desc ...
- 深入了解 Java 中的异常处理 + 面试题
# 深入了解 Java 中的异常处理 + 面试题 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点.比如,try-catch 处理要遵循的原则是什么,finall ...
- 教你5分钟做个手机APP[视频]
天天宅在家里,没什么事做,录个教学视频吧! 发到了视频网站上去根本没人看,伤心ing啊! 不知cnblogs上面是否让我发! 先上一张效果图看看哈: 如果播放不正常请点这里:https://www.b ...
- linux入门系列10--firewalld防火墙管理
上一篇文章学习了用户及文件相关权限,本篇继续学习防火墙技术. 防火墙作为公网与内网之间的保护屏障,对系统至关重要.防火墙又分为硬件防火墙和软件防火墙,主要功能都是依据设置的策略对穿越防火墙的流量进行过 ...