EF Core 新特性——Owned Entity Types
Owned Entity Types
首先owned entity type是EF Core 2.0的新特性。
至于什么是owned entity types,可以先把他理解为EF Core官方支持的值对象。
值对象
举一个简单的例子,你可能在开发中经常遇到,订单,地址,地址簿的关系:
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public Address Address { get; set; }
} public class AddressBook
{
public string FriendName { get; set; }
public int Id { get; set; }
public Address Address { get; set; }
} public class Address
{
public string City { get; set; }
public string Street { get; set; }
}
这个示例里面的Address对象就是典型的值对象,他在订单中意义是订单地址,他在电话本里的意义是朋友的住址,就像订单里的Name和AddressBook中FriendName一样,你改了就改了,和其他的没关系,不会因为你改了订单地址就修改了电话本那个人的地址。
https://www.cnblogs.com/xishuai/p/ddd_valueobject_entityframework.html 这篇大神的文章详细介绍了值对象在以前版本EF中的设计,现在有了Owned Entity Types,就有了官方实现。
定义
官方文档上的定义,翻译过来就是:EF Core 定义在model中仅用于显示的其他实体类型Navigation properties被称为Owned Entity types,就叫做自有实体吧,拥有自有实体的实体叫做拥有者。
下面看看怎么在EF Core中实现。
显式配置
自有实体 在EF Core不能使用惯例方式,可以在OnModelCreating方法中使用OwnsOne方法,或者使用声明属性(OwnedAttribute,EF Core 2.1以上版本支持)。
[Owned]
public class Address
{
public string Street { get; set; }
public string City { get; set; }
} modelBuilder.Entity<Order>().OwnsOne(p => p.Address);
//或者使用这种方式
modelBuilder.Entity<Order>().OwnsOne(typeof(Address), "Address");
这在EF Core中时通过影子属性( shadow property)实现的,
自有实体集合是在EF Core 2.2中实现,可以使用OnModelCreating的OwnsMany方法实现:
modelBuilder.Entity<Distributor>().OwnsMany(p => p.ShippingCenters, a =>
{
a.HasForeignKey("DistributorId");
a.Property<int>("Id");
a.HasKey("DistributorId", "Id");
});
数据库
惯例情况是:Address属性在Order表中的名字是:Address_City和Address_Street,你也可以在OwnsOne方法中使用HasColumnName自定义列名,也可以存储到单独的表中,下面代码将地址存到单独表(orderAddress)中:
modelBuilder.Entity<Order>().OwnsOne(
o => o.Address,
sa =>
{
sa.ToTable("orderAddress");
sa.Property(p => p.Street).HasColumnName("ToStreet");
sa.Property(p => p.City).HasColumnName("ToCity");
});
查询
跟普通的属性一样:
var order = context.Orders.FirstOrDefault();
Console.WriteLine($"TO: {order.ShippingAddress.City}");
限制
- 不能生成自有对象的DbSet<T> 。
- 不能在ModelBuilder中使用自有对象的Entity<T>()。
即将实现:
- 自有对象不支持继承。
- 除非在单独的表中使用,否则自有对象不能为空。
- 多个拥有者不能使用同一个自有对象(废话)。
以前版本存在问题:
- EF Core 2.0中除非存在独立的表中,否则自有对象不能在派生实体类型中声明。
- EF Core 2.0和2.1只支持指向自有对象的reference navigations ,在2.2中移除这一限制。
EF Core 新特性——Owned Entity Types的更多相关文章
- EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇
EFCore Owned Entity Types的定义 EFCore Owned Entity Types的文档在这里:https://docs.microsoft.com/zh-cn/ef/cor ...
- EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之鸡肋篇
鸡肋 鸡肋(Chicken ribs),现代汉语词语,出自<三国志·魏书·武帝纪>裴松之注引<九州春秋>曰:"夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也.& ...
- asp.net core新特性(1):TagHelper
进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...
- .NET Core 新特性:发布单文件可执行程序
一.前言 .NET Core 3.0中新增加了一个特性:Publishing Single EXEs,可以通过dotnet publish 命令将整个.net core应用发布为一个可执行文件. 二. ...
- EF Core 2.1 中的 Eager loading、Explicit loading和LazyLoading (转自MSDN)
Entity Framework Core allows you to use the navigation properties in your model to load related enti ...
- ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First
ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...
- ef core 2.1 利用Query Type查询视图
ef core新加入的功能“Query Type”可以让我们很方便的查询视图而不需要做任何特殊处理.不过在代码上和普通的查询有些不同. 先贴文档:https://docs.microsoft.com/ ...
- ef core SoftDelete Multi-tenancy 软删除、多租户实现 Global Query Filters
ef core提供了Global Query Filters特性来实现多租户与软删除,收集了一些实现方法. 最简单的例子时微软官方的特性解释. https://docs.microsoft.com/e ...
- efcore 新特性 SaveChanges Events
efcore 新特性 SaveChanges Events Intro 昨天早上看到之前关注的一个 efcore 的 issue 被 closed ,于是看了一眼, ef core 新合并了一个 PR ...
随机推荐
- Huawei DHCP 全局配置与接口配置
网络拓扑图如下所示: 说明: 1.交换机Ge0/0/1口和Ge0/0/2口配置基于全局的DHCP: 2.交换机Ge0/0/3口配置基于端口的DHCP: 3.交换机上配置vlan 10 .vlan 20 ...
- AnyHashable类型擦除的原因:set和dictory需要指定一个确定的类型
AnyHashable 属于无关联类型的擦除. 将具体类型的类型信息擦除掉了,只剩下协议类型的信息暴露出来. 类型擦除实践:将相同协议的不同实现屏蔽起来,暴露出类型的共同特征(协议接口). A typ ...
- BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- [GXOI/GZOI2019]逼死强迫症
题目 设我们最后的答案是\(g_n\) 我们发现在最后竖着放一个\(2\times 1\)的,和横着放两个\(1\times 2\)的就可以区分开之前的方案了 所以如果仅仅使用\(1\times 2\ ...
- 洛谷 P1144 最短路计数
传送门:https://www.luogu.org/problemnew/show/P1144 这虽然是一道普及+的题,然而我发现我现在还没做过,这也就直接导致我今天模拟T2只杠了个暴力分…… 那这道 ...
- Spark项目之电商用户行为分析大数据平台之(一)项目介绍
一.项目概述 本项目主要用于互联网电商企业中,使用Spark技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中 ...
- (mac系统下)mysql 入门
1.安装好mysql之后并且服务启动,系统偏好设置里有启动mysql服务的按钮 看到running表示可用 2.通过终端访问mysql 先到mysql的路径下(默认安装没有配置环境变量):cd /us ...
- python变量的引用,浅拷贝
python的变量是对象引用 l1和l2引用的相同的对象,所以会相互影响 元组不变的是引用的物理地址,如果引用的对象是可变的,那么远祖也会发生变化 但是t1[2]的id时钟没有发生变化 2 默认是浅拷 ...
- 面试题之O(n)内旋转字符串
样例: 字符串“abcd1234"左移3位结果为”234abcd1“ K:左移位数 L:字符串长度 方案1:暴力 O(K * L) 可以每次将数组中的元素左移一位,循环K次. abcd123 ...
- 第9章 初识STM32固件库
第9章 初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...