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);
}
}
}
DDD实战12 值对象不创建表,而是直接作为实体中的字段的更多相关文章
- Oracle创建表、索引、主键、字段描述
-- 创建表 create table SX04_LBALANCE ( YEAR VARCHAR2(10) not null, PROGRAMNO VARCHAR2(40) not null, FDA ...
- DDD实战与进阶 - 值对象
目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直 ...
- 应用程序框架实战十六:DDD分层架构之值对象(介绍篇)
前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使 ...
- 应用程序框架实战十七:DDD分层架构之值对象(层超类型篇)
上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践.但是设计与实践的好与坏,对于不 ...
- DDD分层架构之值对象(介绍篇)
DDD分层架构之值对象(介绍篇) 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使 ...
- DDD理论学习系列(7)-- 值对象
DDD理论学习系列--案例及目录 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是strut和enum,引用类型的代表是class.interface.delega ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- DDD 领域驱动设计-三个问题思考实体和值对象
消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...
- DDD分层架构之值对象(层超类型篇)
DDD分层架构之值对象(层超类型篇) 上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好 ...
随机推荐
- POJ 3090 Visible Lattice Points (ZOJ 2777)
http://poj.org/problem?id=3090 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1777 题目大意: ...
- 黑马day18 jquery高级特性&Ajax的load方法
介绍jquery中的load方法: (1).前面没有jquery.修饰,能够判断出他是一个普通的非全局函数(也就是说是一个局部函数):$.,$().,jquery.等修饰的就是全局函数.没有这些修饰的 ...
- 程序猿学英语——In September the English learning summary
转眼间9月份又过去了,又该好好总结一下这个月的英语学习情况了. 在暑假快结束的时候.9期师姐给我们測了英语快照.当初測的时候就发现一个问题:当測自己听过尤其是读过的东 西的时候,自己都能听出来.測自己 ...
- Hadoop基本原理之一:MapReduce 分类: A1_HADOOP 2014-08-17 19:26 1113人阅读 评论(0) 收藏
1.为什么需要Hadoop 目前,一块硬盘容量约为1TB,读取速度约为100M/S,因此完成一块硬盘的读取需时约2.5小时(写入时间更长).若把数据放在同一硬盘上,且全部数据均需要同一个程序进行处理, ...
- [tmux] Automate your workflow using tmux scripts
Do you have a standard workflow that involves setting up a specific tmux layout, or running certain ...
- <Linux> Xen虚拟机下挂载
//创建源vdisk挂载目录: mkdir vd1 //创建目标vdisk挂载目录: mkdir vd2 //只需第一次执行: iscsiadm -m discovery --type sendta ...
- OpenCV编译步骤
作者:朱金灿 来源:http://blog.csdn.net/clever101 1. 从网上下载OpenCV安装包,然后安装. 2. 打开CMake 2.8设置源码路径和生成的VS工程文件路径.(首 ...
- Cocos2d-x 3.0final 终结者系列教程05-AppDelegate入口类
下面是Cocos2d-x的程序入口: class AppDelegate : private cocos2d::Application { public: AppDelegate(); virtua ...
- NSArray NSMutableArray 初始化
NSArray* Array;//此时数组没有初始化,数组=nil [Array objectAtIndex:2];//不会调用其属性方法,这里不会崩溃 NSMutableArray *Mutable ...
- 理解Erlang/OTP - Application
http://www.cnblogs.com/me-sa/archive/2011/12/27/erlang0025.html 1>application:start(log4erl). 我们就 ...