实体框架 POCO - 如果字段更新两次如何防止错误?

2024-04-02

我正在开始使用模型优先配置中的 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 正在创建代理 - 这是否意味着在某些情况下,如果我没有自己的通知,这些方法可能不可用?


我认为第一次您的事件没有被调用,只有第二次才被调用。也许您应该尝试使用实体框架中的事件。 查看this https://stackoverflow.com/questions/3729046/entity-framework-4-how-to-inject-logic-in-property-setter link

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 POCO - 如果字段更新两次如何防止错误? 的相关文章

随机推荐