C# 实体框架代码优先,DTO和n层场景(WCF)

C# 实体框架代码优先,DTO和n层场景(WCF),c#,wcf,entity-framework,ef-code-first,n-tier-architecture,C#,Wcf,Entity Framework,Ef Code First,N Tier Architecture,我读过几篇关于EF和DTO的文章,我需要一些关于在WCF的n层场景中首先使用EF代码和DTO的说明 让我们看一看这些课程: public class Order { public int Id { get; set; } public DateTime ShipDate { get; set; } public ObservableCollection<OrderDetail> Details { get; private set; } } public class

我读过几篇关于EF和DTO的文章,我需要一些关于在WCF的n层场景中首先使用EF代码和DTO的说明

让我们看一看这些课程:

public class Order
{
  public int Id { get; set; }
  public DateTime ShipDate { get; set; }
  public ObservableCollection<OrderDetail> Details { get; private set; }  
}

public class OrderDetail
{
  public int Id { get; set; }
  public int OrderId { get; set; }
  public int ProductId { get; set; }
  public decimal Quantity { get; set; }
}
但是何时,我应该在哪里创建此DTO?我的意思是,我不能在提交更改时创建它,
Order
类中没有更改跟踪信息

看起来,该对象必须在用户请求编辑后与
订单一起创建。这允许跟踪更改。。。我错了吗

请注意,问题与STE无关。由于某些原因,我不想/不能在当前项目中使用它们


非常感谢分享您的经验

如果
Order
类中没有更改跟踪信息,则必须跟踪其他地方的更改-在某些自定义客户端类中(例如,通过侦听应用程序逻辑中的事件),并在需要时将这些更改传递给服务器。检查WCF数据服务-他们可以简化此过程,因为他们有用于更改跟踪的客户端上下文。@LadislavMrnka:问题是“我应该在哪里跟踪更改”?能成为这样的阶级吗?或者,也许,它应该是一些单独的类?最佳做法是什么?(WCF数据服务不是一个选项,我希望在服务和客户端之间使用DTO)。SOA是无状态的,您需要定义状态协议,并将状态作为DTO的一部分来回传递。@sza:我知道SOA是无状态的。要构建DTO,我需要更改跟踪信息。所以,我需要在某个地方的客户变更跟踪。哪里我是否应该仅为变更跟踪目的制作单独的图层?或者我应该在客户端的域类中放置更改跟踪?如果是这样,那么这个实现和STE(从客户端复杂性的角度)之间有什么区别?所有的示例都是玩具示例,它们与实际情况无关。@Dennis通常情况下,CRUD是由HTTP方法(如PUT/GET/POST/DELETE)确定的,您只需对客户端触发的每个操作调用WCF服务即可。如果必须使用外键关系保存对象,则需要在服务器端创建DTO,并在客户端将数据包装到DTO中,然后将其发送回WCF。
[DataContract]
public class UpdateOrderDTO
{
  [DataMember]
  public DateTime ShipDate { get; set; }
  [DataMember]
  public Collection<OrderDetail> NewDetails { get; private set; }
  [DataMember]
  public Collection<OrderDetail> ModifiedDetails { get; private set; }
  [DataMember]
  public Collection<OrderDetail> DeletedDetails { get; private set; }
}