【问题标题】:Entity Framework and partial method实体框架和部分方法
【发布时间】:2013-04-25 17:52:51
【问题描述】:

在我的实体框架模型中,我有该列

    [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

我是那种场景的新手(使用实体框架的部分方法),如何解决它?

【问题讨论】:

    标签: c# entity-framework partial-classes


    【解决方案1】:

    您不能从OnCanShowChanging 内部设置CanShow

    CanShow 的设置器调用OnCanShowChanging,它再次调用设置器,它再次调用OnCanShowChanging...等等。无限循环,直到溢出堆栈。

    【讨论】:

      【解决方案2】:

      您的代码有一个 ciclic 调用。每当您为 CanShow 分配一个值时,它都会一次又一次地触发 OnCanShowChanging。修改您的逻辑并修复该循环调用。

      【讨论】:

        【解决方案3】:

        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
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          • 2013-10-17
          • 1970-01-01
          相关资源
          最近更新 更多