2014-01-27 63 views
0

我遇到一個與通過引用更新對象有關的問題,並且不確定到底發生了什麼。更新foreach中的變量

我需要刪除的規則列表和日誌記錄我需要加載另一個領域

ruleItem.ReferencedItemValue = eventEntity.Title; 

builder.LogDelete(showRule, showRuleResource.ToAuditLog(), "Logic Rule"); 

被稱爲未填充的ReferencedItemValue

任何想法,建議,選擇? 感謝

CODE:

public void DeleteCustomLogicRule(int[] ruleIds){ 
    var rules = uow.Context.ShowRules.Where(sr => ruleIds.Contains(sr.Id)).ToList(); 
    if (rules.Any()) 
    { 
     var showId = rules.FirstOrDefault().ShowId; 
     var builder = AuditBuilder.FromShowId(showId); 
     rules.ForEach(showRule => 
     { 
      var showRuleResource = ToShowRuleResource(showRule); 
      FillReferenceValue(showRuleResource); 
      builder.LogDelete(showRule, showRuleResource.ToAuditLog(), "Logic Rule"); 
      }); 
     uow.Context.SaveChanges(); 
     builder.ToDatabase(); 
    } 
} 

private void FillReferenceValue(ShowRuleResource showRuleResource) 
{ 
    foreach (var ruleItem in showRuleResource.ItemsPredicateAppliesTo.ToList()) 
    { 
     FillRuleItem(ruleItem); 
    } 
} 

private void FillRuleItem(RuleItemResource ruleItem) 
{ 
    var eventEntity = uow.Context.Events.FirstOrDefault(e => e.Id == ruleItem.ReferencedItemId.Value); 
    if (eventEntity != null) 
    ruleItem.ReferencedItemValue = eventEntity.Title; 
} 
+1

你確定'FillRuleItem()'中的'eventEntity'不爲null?你在調試器下運行它嗎?另外,我認爲'RuleItemResource'是一個不是結構體的類?而且我不確定'FillReferenceValue()'中的'.ToList()'是否必要。 –

+1

@MthetheWWatson在'FillRuleItem()' – DGibbs

+0

@DGibbs中的賦值之前有一個空檢查這就是我要問的原因。如果eventEntity始終爲空,則不會發生任務 - 這是OP要求的內容。 –

回答

1

試試這個:

rules.ForEach(showRule => 
    { 
     var item = showRule; 
     var showRuleResource = ToShowRuleResource(item); 
     FillReferenceValue(showRuleResource); 
     builder.LogDelete(item, showRuleResource.ToAuditLog(), "Logic Rule"); 
     }); 
+0

想想也許是閉包? :) Resharper不表示一個,但我會試一試然而 – thedev

+1

是的,它應該是,從Eric lippert閱讀這篇博客文章:http://ericlippert.com/2009/11/12/closing-over-the-循環變量被認爲是有害的第一部分/ –

1


開始從該功能

private void FillRuleItem(RuleItemResource ruleItem) 

看起來這exspressiion挖

var eventEntity = uow.Context.Events.FirstOrDefault(e => e.Id == ruleItem.ReferencedItemId.Value); 

爲空。

+0

檢查它,它不是空的 – thedev

+0

比,我沒有看到你的代碼中的任何罪犯。它可以是一些linq'延遲加載',或者代碼中的某些其他代碼。也許showRuleResource.ToAuditLog()修改值。 – hardsky