更新相关实体DDD

时间:2012-04-07 06:10:07

标签: c# entity-framework domain-driven-design

我对如何使用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

3 个答案:

答案 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关系仍然没有按预期工作,没有办法用构造函数创建实体,而不是公共属性等等。