2009-01-21 120 views
1

好吧,我正在嘗試使用此自定義擴展來執行實體更新。現在它應該更新所有屬性,然後更新所有相關的結束(引用)。問題在於,即使具有更改的實體確實具有有效且正確的實體密鑰(在其調試器中驗證)的相關結尾。當RelationshipManager獲取它時,他們的鍵是空的。任何人看到這個代碼有什麼問題?實體框架 - 分離更新問題

public static void ApplyChanges(this ObjectContext context, EntityObject entityWithChanges) 
    { 
     if (entityWithChanges.EntityState == EntityState.Detached) 
     { 
      object entityCurrentlyInDB = null; 

      if (context.TryGetObjectByKey(entityWithChanges.EntityKey, out entityCurrentlyInDB)) 
      { 
       context.ApplyPropertyChanges(entityWithChanges.EntityKey.EntitySetName, entityWithChanges); 

       foreach (var relatedEnd in ((IEntityWithRelationships)entityCurrentlyInDB).RelationshipManager.GetAllRelatedEnds()) 
       { 
        var oldRef = relatedEnd as EntityReference; 

        if (oldRef != null) 
        { 
         var newRef = 
          ((IEntityWithRelationships)entityWithChanges).RelationshipManager 
          .GetRelatedEnd(oldRef.RelationshipName, oldRef.TargetRoleName) as EntityReference; 
         oldRef.EntityKey = newRef.EntityKey; 
        } 
       } 
      } 
      else 
      { 
       throw new ObjectNotFoundException(); 
      } 

     } 
    } 

這僅僅是一個修飾的我發現了什麼 Here

感謝幫助版本。

UPDATE: 這是更新方法

public static void UpdateTemplate(Template template) 
    { 
     using (TheEntities context = new TheEntities()) 
     { 
      context.ApplyChanges(template); 
      try 
      { 
       context.SaveChanges(); 
      } 
      catch (OptimisticConcurrencyException) 
      { 
       context.Refresh(RefreshMode.ClientWins, template); 
       context.SaveChanges(); 
      } 

      context.RemoveTracking(template); 
     } 
    } 

這是單元測試:

[TestMethod] 
    public void CanUpdateATemplate() 
    { 
     Template template = new Template(); 
     template.Name = "Test"; 
     template.Description = "Test"; 

     TemplateType type = TemplateManager.FindTemplateTypeByName("Test"); 

     if (type == null) 
     { 
      type = new TemplateType(); 
      type.Name = "Test"; 
     } 

     template.TemplateType = type; 

     TemplateManager.AddTemplate(template); 

     template = TemplateManager.FindTemplateByID(template.TemplateID); 

     Assert.IsNotNull(template); 

     type = TemplateManager.FindTemplateTypeByName("Round"); 

     if (type == null) 
     { 
      type = new TemplateType(); 
      type.Name = "Round"; 
     } 

     template.TemplateType = type; 

     TemplateManager.UpdateTemplate(template); 

     template = TemplateManager.FindTemplateByID(template.TemplateID); 

     Assert.IsNotNull(template); 
     Assert.IsTrue(template.TemplateType.Name == "Round"); 

     TemplateManager.DeleteTemplate(template); 

     template = TemplateManager.FindTemplateByID(template.TemplateID); 

     Assert.IsNull(template); 
    } 

回答

1

這簡直是不可能的,因爲要分離工作在EF的方式。

我發現如果我自己添加了關鍵信息,我可以使通用調用工作,甚至保存它。

問題是,在你調用Detach之後返回實體的那一刻你就失去了所有的關係數據。我發現了一些關於爲每個實體編寫圖形管理器的文章,但是我發現像EF這樣的東西會浪費時間來做這件事(據說它會在v2中)。

EF尚未準備好進行N層部署。