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

时间: 2024-09-29 21:19:37

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

Oracle创建表、索引、主键、字段描述

-- 创建表 create table SX04_LBALANCE ( YEAR VARCHAR2(10) not null, PROGRAMNO VARCHAR2(40) not null, FDATE VARCHAR2(10) not null, FACCTCODE VARCHAR2(50) not null, FCURCODE VARCHAR2(3) not null, FAACCCREDIT NUMBER(19,4) default 0 not null, FAENDBAL NUMBER

DDD实战与进阶 - 值对象

目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一.但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久化时感到非常的迷惑.本篇文章会从值对象的概念出发,解释什么是值对象以及怎么运用值对象,并且给出相应的代码片段(本教程的代码片段都使用

应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不奇怪,因为多年来养成的数据建模思维已经牢牢把你禁锢,以致于你在使用面向对象方式进行开发时,还是以数据为中心. 当我们完成了基本的需求分析以后,如果说需要进行设计,那么你能想到的就是数据库表及表关系的设计,这就是数据建模.数据建模的主要依据是数据库范式设计,根据要求严格程度的递增分为

应用程序框架实战十七:DDD分层架构之值对象(层超类型篇)

上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践.但是设计与实践的好与坏,对于不同的人,以及处于不同的环境都有不同的诠释,这是一个仁者见仁,智者见智的问题.DDD非常抽象,以至于它的每一个概念,对于不同的人都有不同的看法,更何况基于DDD的.Net实践,就更难分辨哪一个用法更标准.更正宗. 我对DDD的认识虽然还很肤浅,用得也很山寨,但这可能更加适合初步接触DDD的朋友.还是那

如何运用领域驱动设计 - 值对象

原文:如何运用领域驱动设计 - 值对象 目录 概述 何为值对象 值对象是基于上下文的 当前上下文的值对象可能是另一个上下文的实体 怎么运用值对象 尽量避免使用基元类型 值对象是内聚并且可以具有行为 来看一个例子 值对象的持久化 总结 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一.但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久化时感到非常的迷惑.本篇文章会从值

Oracle创建表空间和表

创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablespace)         存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据.当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件数据表         在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层. 我们在数据库中存放数据,最

&lt;&lt;ABP框架&gt;&gt; 值对象

文档目录 本节内容: 简介 值对象基类 最佳实践 简介 “一个表示领域的一个描述性方面的没有概念上的身份对象,称为值对象.“(Eric Evans). 与一个有身份(Id)实体相反,一个值对象没有身份.如果两个实体的身份(Id)不同,它们被认为是不同对象/实体,即使其它所有的属性都相同.比如两个不同的Person实体,它们的Name.Surname和Age相同,如果它们的Id不同,我们就认为这是两个不同的Person.但是,对于一个Address(地址,一个经典的值对象)类,如果两个地址有相同的

Oracle创建表语句(Create table)语法详解及示例

Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字符串, 不规定长度默认值为1NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.DATE 日期和时间类型LOB 超长字符, 最大可达4GCLOB 超长文本字符串BLOB 超长

四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

Django框架,models.py模块,数据库操作--创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, oracle,postgresql数据库. 1,django默认使用sqlite的数据库,默认自带sqlite的数据库驱动   引擎名称:django.db.backends.sqlite3 在全局配置文件settings.py可以看到确认配置使用的sqlite数据库 # Database # h