• 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);
            }
        }
    }
  • 相关阅读:
    grpc xservice 使用
    modsecurity3.0 nginx 安装
    scrapy docker 基本部署使用
    fabio 安装试用&&实际使用的几个问题
    yugabyte cloud native db 基本试用
    coredns 编译模式添加插件
    gradle 项目构建以及发布maven 私服&& docker 私服构建发布
    groovy gradle 构建配置
    groovy && java 混编 gradle 配置
    gradle 构建包含源码配置
  • 原文地址:https://www.cnblogs.com/wholeworld/p/9410596.html
Copyright © 2020-2023  润新知