我对如何使用DDD更新相关实体感到困惑。假设我有一个Employee Class和Workschedule Class。我该如何更新某个员工的具体工作安排? Employee和Workschedule之间的关系是One-To-Many。下面是我正在使用的代码如何添加/更新某个工作计划。
public class Employee
{
public int EmployeeId { get; set; }
public virtual ICollection<WorkSchedule> WorkSchedules { get; set; }
public WorkSchedule AddWorkSchedule(WorkSchedule workSchedule)
{
this.WorkSchedules.Add(workSchedule);
return workSchedule;
}
public WorkSchedule EditWorkSchedule(WorkSchedule workSchedule)
{
var originalWorkSchedule = this.WorkSchedules.FirstOrDefault(w => w.WorkscheduleId == workSchedule.WorkscheduleId);
originalWorkSchedule.ClockIn = workSchedule.ClockIn;
originalWorkSchedule.ClockOut = workSchedule.ClockOut;
return originalWorkSchedule;
}
}
public class WorkSchedule
{
public int WorkScheduleId { get; set; }
public DateTime ClockIn { get; set; }
public DateTime ClockOut { get; set; }
public int EmployeeId { get; set; }
}
这是对的吗?我是否正确关注DDD?此外,我现在的想法Workschedule是一个价值对象,但我正在为了规范化目的而使用ID
答案 0 :(得分:0)
你的模型应该是“POCO”类
CRUD方法如添加或编辑将被视为“服务”或“存储库”的一部分
这是一个简单的想法,我想到了它应该是什么样子以及它的用法......
IRepository repository { get; set; } //implement Interface and inject via IoC Container
//..usage
var employee = repository.GetEmployee(123); //get by id
//..new WorkSchedule
employee.WorkSchedules.Add(workSchedule);
var result = repository.Save(employee);
答案 1 :(得分:0)
由于这里的所有内容都与EF有关,因此DDD并不多。如果代码按照需要工作,那就没关系。但DDD与EF或任何其他ORM没有任何关系。您应该设计Domain对象,而不必关心数据库或ORM。然后,在存储库中将域实体映射到将由ORM处理的持久性实体。
此外,我现在的想法Workschedule是一个价值对象,但我正在将ID和ID用于规范化目的
这是层和模型混合时的结果。您不需要域中的ID,但需要id来表示持久性。试图在一个模型中满足这两个要求并调用该模型域无处可去。
答案 2 :(得分:0)
EF它不适用于DDD,它太笨拙了。 EF适用于那些喜欢将SQL表映射到实体并且像ActiveRecord反模式一样的代码,但是在更智能的开发人员开始称之为不良做法后,他们开始使用ORM,实体并继续编码。
我在EF过去3年一直在努力让它以DDD方式工作。它成功抵抗并获胜。没有黑客它不起作用。 on-to-many关系仍然没有按预期工作,没有办法用构造函数创建实体,而不是公共属性等等。