2013-04-25 37 views
0

在我的實體框架模型,我通過使用部分類有柱實體框架和部分法

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] 
    [DataMemberAttribute()] 
    public Nullable<global::System.Boolean> CanShow 
    { 
     get 
     { 
      return _CanShow; 
     } 
     set 
     { 
      OnCanShowChanging(value); 
      ReportPropertyChanging("CanShow"); 
      _CanShow = StructuralObject.SetValidValue(value); 
      ReportPropertyChanged("CanShow"); 
      OnCanShowChanged(); 
     } 
    } 
    private Nullable<global::System.Boolean> _CanShow; 
    partial void OnCanShowChanging(Nullable<global::System.Boolean> value); 
    partial void OnCanShowChanged(); 

,我想添加一些業務邏輯OnCanShowChanging方法

這樣做,我嘗試代碼:

public partial class MyTable 
{ 
    partial void OnCanShowChanging(bool? value) 
    { 
     if (some_condition) 
     { 
      this.CanShow = value; 
     } 
     //else -> avoid column data change 
    } 
} 

但我得到StackOverflowException

我在這種情況下是新的(部分方法與實體框架),如何解決它?

回答

1

您不能從OnCanShowChanging中設置CanShow

設置者CanShow調用OnCanShowChanging,它再次調用setter,它再次調用OnCanShowChanging ...依此類推。無限循環,直到你溢出堆棧。

1

您的代碼有一個ciclic調用。每當你給CanShow賦值時,它會一次又一次地觸發OnCanShowChanging。修改你的邏輯並修復那個經常性的呼叫。

1

OnCanShowChanging在設置了CanShow時被遞歸調用。處理這個問題的更好方法可能是做類似的事情:

public partial class MyTable 
    { 
     private bool blockOnCanShowChanging = false; 

     partial void OnCanShowChanging(bool? value) 
     { 
      if (blockOnCanShowChanging) 
      { 
       return; //Recursive call...just return 
      } 

      if (some_condition) 
      { 
       //Turn on bool to avoid recusive call 
       blockOnCanShowChanging = true; 

       this.CanShow = value; 

       //reset bool to allow subsequent calls to OnCanShowChanging 
       blockOnCanShowChanging = false; 
      } 

      //else -> avoid column data change 
     } 
    }