2012-03-16 66 views
1

我正在使用EF4。我從DTO列表中添加了一系列新實體,並且在添加完所有這些實體之後才保存更改。我想將DTO的ID設置爲新實體的ID。我到底怎麼做到這一點? EF是否爲此提供了一種機制?如何在插入多個新實體時更新我的​​DTO ID

用一個單一的實體,我會做這樣的:

public void InsertMyDto(MyDto a_dto) 
{ 
    var newEntity = new MyEntity 
     { 
      Name = a_dto.Name, 
      Type = a_dto.Type.ToString(), 
      Price = a_dto.Price 
     }; 

    _dataContext.MyEntities.AddObject(newEntity); 
    _dataContext.SaveChanges(); 

    a_dto.ID = newEntity.ID; 
} 

這工作得很好,但我該怎麼辦在這種情況下?

public void InsertMyDtos(IEnumerable<MyDto> a_dtos) 
{ 

    foreach (var myDto in a_dtos) 
    { 
     var newEntity = new MyEntity 
      { 
       Name = myDto.Name, 
       Type = myDto.Type.ToString(), 
       Price = myDto.Price 
      }; 

     // Does some validation logic against the database that might fail. 

     _dataContext.MyEntities.AddObject(newEntity); 
    } 

    _dataContext.SaveChanges(); 

    // ??? 
} 
是針對數據庫進行,它得到 SaveChanges之前失敗,如果失敗,我希望它失敗作爲

我想保存一次全部,因爲我有驗證工作(上面沒有顯示)整個交易(即回滾)。

回答

2

我不認爲EF可以幫助你。它甚至不能幫助你一個強迫你寫a_dto.ID = newEntity.ID的實例。此代碼的多個實體的副本將跟蹤對的dtos和新的實體:

public void InsertMyDtos(IEnumerable<MyDto> a_dtos) 
{ 
    Dictionary<MyDto, MyEntity> dict = new Dictionary<MyDto, MyEntity>(); 
    foreach (var myDto in a_dtos) 
    { 
     var newEntity = new MyEntity 
      { 
       Name = myDto.Name, 
       Type = myDto.Type.ToString(), 
       Price = myDto.Price 
      }; 

     dict.Add(myDto, newEntity); 

     // Does some validation logic against the database that might fail. 

     _dataContext.MyEntities.AddObject(newEntity); 
    } 

    _dataContext.SaveChanges(); 

    foreach (var item in dict) 
     item.Key.ID = item.Value.ID; // Key is MyDto, Value is MyEntity 
} 
+0

這導致我有進一步的問題。顯然,在DTO上設置ID對客戶端沒有影響?現在它沒有意義。我的DTO代表一個默認實體和一個新創建的自定義實體。它擁有兩個鍵。所以它在創建實體之前存在於客戶端上。在這種情況下,在服務器上對DTO進行的更改不會反映在客戶端上。雖然他們是我單獨插入的時候。無論如何,你是對的。 **嘆** – Jordan 2012-03-19 14:42:28

相關問題