DDD/ABP/EF Core :新特性Owned Entity Types ,尝试另外一种值对象的配置方式

前置 笔记:

DDD/ABP/EF Core 实现值对象Value Object_董厂长的博客-CSDN博客有一说一DDD真tM抽象 :https://blog.csdn.net/dongnihao/article/details/126650869?spm=1001.2014.3001.5501上述博客是实现值对象的通用方法。

深入理解看一下这个博客:

EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇 - 肥健 - 博客园

EFCore Owned Entity Types其实是一个倾向于 Code First 的功能,它就是为了从逻辑设计上,直接支持那种 实体A 包含(或者拥有) 实体B 的场景。
例如,某人拥有一些列的联系方式、或者某人拥有一系列的银行账号以及这些账号的余额,等等。。。

EF Core实现了一个新特性,owned entity type是EF Core 2.0的新特性。

至于什么是owned entity types,可以先把他理解为EF Core官方支持的值对象。

举个栗子:

《领域驱动设计》中的例子,address是一个经典的值对象。

官方文档上的定义,翻译过来就是:EF  Core 定义在model中仅用于显示的其他实体类型Navigation properties被称为Owned Entity types,叫做自有实体,拥有自有实体的实体叫做拥有者

自有实体  在EF Core不能使用惯例方式,可以在OnModelCreating方法中使用OwnsOne方法,或者使用声明属性(OwnedAttribute,EF Core 2.1以上版本支持)。

以下开始对比:

1.

// 通常来说,需要在配置文件下写明OwnsOne一个值对象
modelBuilder.Entity<Order>().OwnsOne(p => p.Address);
//或者使用这种方式
modelBuilder.Entity<Order>().OwnsOne(typeof(Address), "Address");

2. 新特性,另外一种方式

[Owned]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

数据库

惯例情况是: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}");

限制摘抄自:

EF Core 新特性——Owned Entity Types - indexlang - 博客园

暂时不理解,这边先记录下

限制

  • 不能生成自有对象的DbSet<T> 。
  • 不能在ModelBuilder中使用自有对象的Entity<T>()。

即将实现:

  • 自有对象不支持继承。
  • 除非在单独的表中使用,否则自有对象不能为空。
  • 多个拥有者不能使用同一个自有对象(废话)。

 以前版本存在问题:

  • EF Core 2.0中除非存在独立的表中,否则自有对象不能在派生实体类型中声明。
  • EF Core 2.0和2.1只支持指向自有对象的reference navigations ,在2.2中移除这一限制。

加入思考🤔:

hasOne和ownsOne的区别

简单理解就是,hasOne是某属性指向另外一个实体,ownsOnes是某属性是一个值对象。

顺带复习一下,值对象在数据库中会展开为多个列

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值