我正在开始使用模型优先配置中的 POCO 实体框架。我有一个稍微不标准的模型 - 通过自定义 .tt 文件生成以响应 .edmx 中的自定义属性,使我能够触发 NotifyPropertyChanged 事件来记录对某些属性的更新 - 这导致一个实际上看起来有点像的类这:
public partial class MyClass: INotifyPropertyChanged
{
/// <summary>
/// Catches events to be added to the UserLog
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Notifies any event listeners attached to the PropertyChanged event that a loggable field
/// update has occurred.
/// </summary>
/// <param name="eventType">The type of the field.</param>
/// <param name="message">The message to record in the logs</param>
private void NotifyFieldUpdate(string eventType, string message)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new LogEventArgs(eventType, message));
}
}
private string _myField;
public virtual string MyField
{
get
{
return _myField;
}
set
{
if ( _myField != value )
{
_myField = value;
NotifyFieldUpdate( "FIELDCHANGE", String.Format("MyField changed to {0}", value) );
}
}
}
}
然后,在分部类的另一部分中配置事件处理程序,以避免不必要的覆盖。
我遇到的问题是,如果更新两次,它就会崩溃:
public void TestBehaviour(ObjectContext currentContext)
{
MyClass testMe = FetchFromObjectContext(currentContext);
testMe.MyField = "Hello";
currentContext.SaveChanges();
testMe.MyField = "Goodbye";
}
当我调用第二个方法时,我遇到了以下错误:
调用 EntityMemberChanged 或 EntityComplexMemberChanged 时,未首先在具有相同属性名称的同一更改跟踪器上调用 EntityMemberChanging 或 EntityComplexMemberChanging。有关正确报告更改的信息,请参阅实体框架文档。
我尝试过使用currentContext.DetectChanges()
and currentContext.Refresh( ... )
但这确实是猴子编码,因为我不知道到底发生了什么。
我的第一个问题是:是什么导致了这个问题?为了避免这种类型的错误,我必须如何处理 ObjectContext?对我来说,字段可以不时更新似乎很合理,如果这种情况发生两次,我会讨厌我的系统崩溃。
我的第二个也许更深入的问题是:我使用INotifyPropertyChanged
当类似乎正在触发这些接口时EntityMemberChanged
已经有活动了吗?我认为这是因为 ObjectContext 正在创建代理 - 这是否意味着在某些情况下,如果我没有自己的通知,这些方法可能不可用?