EFCore:关于DDD中值对象(Owns)无法更新数值 - 没有星星的夏季 - 博客园
//修改数据 using (var db = new DemoMigrationsDbContextFactory().CreateDbContext(args)) { var myTable = db.MyTable.Find(1); myTable.DecimalValue1 = 10m; myTable.DecimalValue2 = 20m; //myTable.MyOwns = new MyOwns(10m, 20m); //正确用法 myTable.MyOwns.Update(10m, 20m); //错误用法,值对象应该赋值,不应该修改其里面的值! db.SaveChanges(); }
总结
DDD(领域驱动设计)是应对复杂软件设计的利器,而EFCore为DDD中的实体,值类型等持久化提供了非常方便的解决方案,但是在使用时,我们要切记:
1、值对象要当做和int,String,DateTime等类型一样使用,哪怕是修改值对象中一个属性,也需要从新创建一个值对象!
2、EFCore提供的OwnsOne或者OwnsMany方法关联的值对象中的属性默认是可空的,而对实体则是会根据属性类型是否可空而定,所以使用时要根据自己的需求而定。
3、EFCore提供的OwnsOne或者OwnsMany方法关联的值对象中的属性尽可能不要设置默认值,这里笔者只是用decimal类型碰到了,但是不排除还有其它类型也会有这样的问题
4、目前这几点在.net 5.0简单测试过了,结果也是一样,那么估计是有意这么做的,所以大家使用时多留意吧