[英]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.