DDD实战12 值对象不创建表,而是直接作为实体中的字段

 这里的值对象如下风格:

namespace Order.Domain.PocoModels
{
    //订单地址
    //虽然是值对象 但是不继承ValueObject 
    //因为继承ValueObject会有Id属性 我们不为它创建独立建表不要Id
    public partial class OrderAdress
    {
        public string Province { get; set; }
        public string City { get; set; }
        public string Zero { get; set; }
        public string Street { get; set; }
    }
}
namespace Order.Domain.PocoModels
{
    //之所以把明细的总价作为一个单独的值对象,而不将其作为明细的一个属性
    //是因为其中有逻辑,要通过产品数量乘以单个产品的P价格算出总价格
    //不继承ValueObject
    public partial class OrderItemTotalPrice
    {
        //明细总价
        public decimal SubTotalPrice { get; set; }
    }
}
using DDD.DomainBase;
using System;
using System.ComponentModel.DataAnnotations;

namespace Order.Domain.PocoModels
{
    //产品明细 实体
    public partial class OrderItem : IEntity
    {
        [Key]
        public Guid Id { get ; set; }
        public string Code { get; set ; }
        public OrderItemTotalPrice OrderItemTotalPrice { get; set; }
        public OrderItemTotalPV OrderItemTotalPV { get; set; }
        public ProductSKUs ProductSKUs { get; set; }
        public int Count { get; set; }
    }
}

关键的ef上下文如下:

using Microsoft.EntityFrameworkCore;
using Order.Domain.PocoModels;

namespace Order.Domain
{
    public class OrderEFCoreContext:DbContext,IOrderContext
    {
        public DbSet<Orders> Order { get; set; }

        public DbSet<OrderItem> OrderItem { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=localhost;Database=DDD1DB;User ID=sa;Password=0");
        }

        /// <summary>
        /// 这个重写的目的是 
        /// 将值对象  OrderAdress  OrderTotalPrice  OrderTotalPV 中的字段都放入到 Orders对应中的表中 不让其自己创建表
        /// 将值对象  OrderItemTotalPrice  OrderItemTotalPV  ProductSKUs 中的字段都放入到OrderItem对应中的表中 不让其自己创建表
        /// 如果没有这个重写 会报错 因为没有这个重写 会为每个值对象创建表,但是我们的值对象没有ID做主键
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderAdress);
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderTotalPrice);
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderTotalPV);

            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.OrderItemTotalPrice);
            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.OrderItemTotalPV);
            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.ProductSKUs);
        }
    }
}

 

转载于:https://www.cnblogs.com/wholeworld/p/9410596.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DDD(领域驱动设计)是一种软件设计思想,其包含了四个重要的概念:实体对象、聚合根和领域服务。 1. 实体(Entity) 实体是指具有唯一标识的对象,它具有生命周期,并且在系统要被跟踪和修改。实体通常是通过唯一标识来进行识别和区分的。例如,订单、用户、商品等都可以是实体。 例如,订单实体包含了订单号、下单时间、订单状态等属性,同时具有一些操作,比如修改订单状态、添加订单项等。 2. 对象(Value Object) 对象是指没有唯一标识的对象,它的属性可以改变,但是不会改变对象的身份。对象通常作为实体的属性存在,比如订单的收货地址、商品的价格等。对象通常是不可变的,即创建后不可修改。 例如,收货地址对象包含了姓名、电话、地址等属性,它们的可以改变,但是这个地址本身并没有唯一标识。 3. 聚合根(Aggregate Root) 聚合根是指一组具有关联关系的实体对象的集合,其一个实体作为聚合根,负责管理整个聚合。聚合根可以保证整个聚合的完整性和一致性。在聚合内,实体只能通过聚合根来进行访问和修改。 例如,订单聚合包含了订单实体、订单项实体以及收货地址对象,订单实体是聚合根,通过订单实体管理整个聚合。 4. 领域服务(Domain Service) 领域服务是指在领域模型,不属于任何实体对象的操作,它们通常是跨实体的业务操作,或者是要进行复杂计算的操作。 例如,计算订单的总金额就是一个领域服务,它要查询订单的所有订单项,并计算每个订单项的金额,最后求和计算出订单的总金额。 总之,DDD实体对象、聚合根和领域服务是设计领域模型的重要概念,它们能够帮助我们构建具有高内聚、低耦合、易扩展的领域模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值