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