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); } } }