2009-08-12 34 views
0

我有這個測試在我的測試基地:爲什麼AutoMapper/EF添加新項目而不是關係?

public void WorksWithAreaUsers() 
     { 
      using (new TransactionScope()) 
      { 
       //arrange 
       var userBusiness = new UserBusiness(); 
       var user = new User 
       { 
        Name = "TestUser###", 
        Login = "domain\test-user###" 
       }; 
       userBusiness.Add(user); 

       var areaBusiness = new AreaBusiness(); 
       var area = new Area 
       { 
        Name = "TestArea###", 
        Description = "Test Area Description", 
        Users = new List<User> { user } 
       }; 

       //act 
       areaBusiness.Add(area); 

       //assert 
       var areaFromDb = areaBusiness.FindById(area.AreaID); 
       Assert.IsNotNull(areaFromDb.Users); 
       Assert.IsTrue(areaFromDb.Users.Count > 0); 
       Assert.IsTrue(areaFromDb.Users.Any(c => c.UserID == user.UserID)); 
      } 
     } 

它是做什麼:

  • 插入一個新用戶的基礎;
  • 插入一個新的區域與用戶關係的基地,

實際發生的:

  • 新用戶插入;
  • 插入新區域;
  • 重新插入新用戶,並有區域關係;

會發生什麼?

的更多信息:

  • 區域和用戶不EntityObjects真的。我使用AutoMapper映射DTO/Entity,我認爲問題在於這個邏輯。在某個時刻,我必須在List和EntityCollection之間進行映射。我創建一個新的EntityCollection,並使用EntityCollection.Add方法將用戶轉換爲此集合中的UserEntity。我想我應該使用Attach來創建一個新的實體,但是如果沒有正確的綁定,從一個EntityCollection調用這個方法是行不通的。

您是否建議任何比這更聰明的解決方案或解決此問題的解決方法?我真的需要項目層(Web - > Business - > Data - > EF),因爲模塊化原因,asp.net直接與EF一起工作是我們不能在這裏完成的。

編輯

我放棄了使用AutoMapper做這個工作的念頭= /我沒有很多的實體,並改變我需要在這個圖書館工作要做,以便上班需要一些努力,這不是一件小事。我自己做映射比較好。

回答

1

我假設你的User對象有一個Area屬性,它也可以用來建立實體之間的關係。在創建區域對象後,只需將User.Area設置爲等於新區域,而不是將Area.Users設置爲等於新列表, 。這是我處理關聯新實體的方式,它可靠地工作。

編輯

如果我理解你在做什麼,你正在創建的業務對象(BOS),後來創建實體對象(EO),並附上這些個EO到上下文並保存它們。

假設我的基本知識正確,確定問題的確切原因需要查看相應BO如何創建EO並將其附加到上下文的代碼。

+0

這是一個多對多的關係。它會改變什麼嗎? – 2009-08-12 14:47:45

+0

在這種情況下,請嘗試執行Users.Add(user)或user.Areas.Add(Area)類型的邏輯。 – 2009-08-12 15:52:22

0

我的猜測(和它只是一個猜測)是AutoMapper是不是做身份分辨

所以當它看到在圖中不同地方的同一對象(用戶),它創建一個新的對象,而不是重新使用它以前創建的對象。

這可能會解釋你所看到的。

亞歷克斯

相關問題