简体   繁体   English

实体框架和局部方法

[英]Entity Framework and partial method

in my Entity Framework model, I have that column 在我的实体框架模型中,我有一列

    [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();

by using the partial class, I want to add some business logic in OnCanShowChanging method 通过使用部分类,我想在OnCanShowChanging方法中添加一些业务逻辑

to do so, I try the code: 为此,我尝试代码:

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

But I get the StackOverflowException 但是我得到了StackOverflowException

I'm new in that scenario (partial method with Entity Framework), how to fix it ? 在这种情况下我是新手(使用Entity Framework的部分方法),如何解决呢?

You can't set CanShow from inside OnCanShowChanging . 你不能设置CanShow从内OnCanShowChanging

The setter for CanShow calls OnCanShowChanging , which calls the setter again, which calls OnCanShowChanging again... And so on. CanShow的设置器调用OnCanShowChanging ,它再次调用设置器,再次调用OnCanShowChanging ...依此类推。 Infinite loop until you overflow the stack. 无限循环,直到堆栈溢出为止。

Your code have a ciclic call. 您的代码进行了三次调用。 Whenever you assign a value to CanShow it fires the OnCanShowChanging again and again. 每当您为CanShow分配一个值时,它就会一次又一次触发OnCanShowChanging。 Modify your logic and fix that recurrent call. 修改您的逻辑并修复该重复调用。

OnCanShowChanging is being called recursively when CanShow is set. OnCanShowChanging时将递归调用CanShow a better way to deal with this might be to do something like: 解决此问题的更好方法可能是执行以下操作:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM