2016-11-28 68 views
0

之間的關係,我有以下架構處理一個一對多的業務邏輯和數據訪問層

  • 業務邏輯:業務邏輯在這裏發生。這與數據層處理變換對象只(=包含業務相關的數據,沒有任何技術數據對象)
  • 數據訪問層:提供連接到數據庫。接受數據變換對象並進入實體對象(含有像技術IDS數據庫相關信息=對象)變換它們。返回數據轉換對象
  • 一些其他層(不重要)

現在我負責的一個一對多的關係(例如:發票可以有多個位置)。

數據變換對象

public class InvoiceDto 
{ 
    public string Number { get; set; } 
    public DateTime CreationDate { get; set; } 
    public List<InvoicePositionDto> InvoicePositions { get; set; } 
} 

public class InvoicePositionDto 
{ 
    public string Description { get; set; } 
    public decimal Costs { get; set; } 
} 

實體對象

[Table("Invoices")] 
public class InvoiceEntity : BaseEntity 
{ 
    [Required] 
    public string Number { get; set; } 
    [Required] 
    public DateTime CreationDate { get; set; } 

    public virtual ICollection<InvoicePositionEntity> InvoicePositions { get; set; } 
} 

[Table("InvoicePosition")] 
public class InvoicePositionEntity : BaseEntity 
{ 
    [Required] 
    public string Description { get; set; } 
    [Required] 
    public decimal Costs { get; set; } 

    [Required] 
    public int InvoiceId { get; set; } 
    public virtual InvoiceEntity Invoice { get; set; } 
} 

在創建發票,我只是插上數據訪問層所有位置。

當更新的發票,我要考慮關於發票的位置有下列情形:

  1. 沒有改變
  2. 一個新的位置加入
  3. 的職位已被刪除
  4. 現有的位置被改變

我如何處理這些情況?我想我總是有「比較」的InvoicePositionDtos與現有數據集的InvoicePositionEntities。有更容易的方法嗎?

技術細節 - 下面的框架中使用:

  • 實體框架
  • AutoMapper
+0

EntityFramework可以處理所有這些情況。你基本上是拋所有窗外的分層是失去了實體的頂部信息的DTO(其中,順便說一下,基本上都是DTO的了。)這樣做值得嗎?你在獲得什麼? – jlew

+0

所以你的建議是從實體框架的底部(數據訪問層)發送實體到頂部(視圖)?我在過去的項目中做過這件事,並遇到一些問題,我的觀點直接從實體框架綁定到模型。 – mosquito87

+0

有什麼問題? – jlew

回答

-1

你嘗試像下面這樣?

AutoMapper.Mapper.CreateMap<InvoiceDto, InvoiceEntity>() 
    .ForMember(dest => dest.InvoicePositions, opts => opts.MapFrom(src => src.InvoicePositions.Select(x => AutoMapper.Mapper.Map<InvoiceEntity>(x)).ToList()));