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的更多相关文章

  1. EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇

    EFCore Owned Entity Types的定义 EFCore Owned Entity Types的文档在这里:https://docs.microsoft.com/zh-cn/ef/cor ...

  2. EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之鸡肋篇

    鸡肋 鸡肋(Chicken ribs),现代汉语词语,出自<三国志·魏书·武帝纪>裴松之注引<九州春秋>曰:"夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也.& ...

  3. asp.net core新特性(1):TagHelper

    进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...

  4. .NET Core 新特性:发布单文件可执行程序

    一.前言 .NET Core 3.0中新增加了一个特性:Publishing Single EXEs,可以通过dotnet publish 命令将整个.net core应用发布为一个可执行文件. 二. ...

  5. 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 ...

  6. 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 ...

  7. ef core 2.1 利用Query Type查询视图

    ef core新加入的功能“Query Type”可以让我们很方便的查询视图而不需要做任何特殊处理.不过在代码上和普通的查询有些不同. 先贴文档:https://docs.microsoft.com/ ...

  8. ef core SoftDelete Multi-tenancy 软删除、多租户实现 Global Query Filters

    ef core提供了Global Query Filters特性来实现多租户与软删除,收集了一些实现方法. 最简单的例子时微软官方的特性解释. https://docs.microsoft.com/e ...

  9. efcore 新特性 SaveChanges Events

    efcore 新特性 SaveChanges Events Intro 昨天早上看到之前关注的一个 efcore 的 issue 被 closed ,于是看了一眼, ef core 新合并了一个 PR ...

随机推荐

  1. oracle中insert 多条数据方法

    oracle中的insert 和 mysql添加多条数据的 方式不太一样 用到的语法: insert all into 表名(需要添加的表字段)values(添加的字段数据一定要对应字段顺序) int ...

  2. 异常System.BadImageFormatException

    [问题描述] Server Error in '/' Application. Could not load file or assembly 'WebDemo' or one of its depe ...

  3. 【QT5】 第一个hello world 程序

    #include <QApplication> #include <QWidget> #include <QPushButton> int main(int arg ...

  4. 1.4环境的准备(四)之Pycharm的使用技巧

    返回总目录 目录: 1.快捷键的使用: 2.提示技巧: 3.其他技巧: (一)快捷键的使用: (1)Pycharm自带默认的快捷键 1.Ctrl + C 复制 2.Ctrl + V 粘贴 3.Ctrl ...

  5. Beta阶段第三次冲刺

    Beta阶段第三次冲刺 严格按照Git标准来,组员有上传Git的才有贡献分没有的为0 代码签入图 1.part1 -站立式会议照片 2.part2 -项目燃尽图 3.part3 -项目进展 1.正在进 ...

  6. 张高兴的 .NET Core IoT 入门指南:(一)环境配置、Blink、部署

    如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序?你可能会回答使用 C++ 或 Python 去访问 Raspberry Pi 的引脚.现在,C# 程 ...

  7. 028、HTML 标签3表单标签插入组件

    内容:表单标签插入组件(经常使用)############################################################## form表单标签和input组件 < ...

  8. 【转】org.jdom.IllegalDataException: The data ""is not legal for a JDOM attribute: 0xb is not a legal 异常

    今天用jdom生成xml,在操作中出现了 org.jdom.IllegalDataException: The data ""is not legal for a JDOM att ...

  9. Angular2学习笔记(1)——Hello World

    1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...

  10. MySql详解(四)

    MySql详解(四) MySql的DML操作 插入: 一.方式一 语法: insert into 表名(字段名,...) values(值,...); 特点: 1.要求值的类型和字段的类型要一致或兼容 ...