【问题标题】:Update related property (like a trigger) in a POCO entity, is it possible?更新 POCO 实体中的相关属性(如触发器),有可能吗?
【发布时间】:2012-10-06 22:59:19
【问题描述】:

我有以下 POCO 实体:

public class User 
{
    [...other properties...]

    public byte Status { get; set; }
    public DateTime? DataStatus { get; set; }  
}

我想要什么:在属性Statusset 方法内,将DataStatus 更新为Status 更改时的当前日期,可以吗?

【问题讨论】:

    标签: c# entity-framework linq-to-entities poco


    【解决方案1】:

    如果您首先使用代码,则可以将属性返回到私有字段并实现自己的 getter 和 setter。如果您首先使用 DB/Model,则可以覆盖生成的类中的方法,因为它们是部分的。我猜你的例子,你可以执行以下操作。

    public class User
    {
        private byte _status;
        public byte Status
        {
            get { return _status; }
            set
            {
                _status = value;
                this.DataStatus = DateTime.Now;
            }
        }
        public DateTime? DataStatus { get; set; }
    }
    

    【讨论】:

    • 当我运行代码时,我得到了以下错误:EntityMemberChanged 或 EntityComplexMemberChanged 被调用,而没有首先在具有相同属性名称的同一更改跟踪器上调用 EntityMemberChanging 或 EntityComplexMemberChanging。有关正确报告更改的信息,请参阅实体框架文档。
    • @ViniciusOttoni 您可能需要按照错误中的说明实现INotifyPropertyChangingINotifyPropertyChanged
    【解决方案2】:
    public void SetupDbContext(DbContext context)
    {
        (DbContext as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext.SavingChanges += delegate(object sender, EventArgs e)
        {
            var modified = context.ChangeTracker.Entries<User>().Where(entry => entry.State == EntityState.Modified);
            foreach (var entry in modified)
            {
                if (entry.Property("Status").IsModified)
                {
                    entry.Entity.DataStatus = DateTime.Now;
                }
            }
        };
    }
    

    【讨论】:

      【解决方案3】:

      当然,这很简单。您必须使用支持字段属性而不是自动属性:

      public class User
      {
      
          private byte _status;
          public byte Status
          {
              get { return _status; }
              set
              {
                  _status = value;
                  DataStatus = DateTime.Now;
              }
          }
          public DateTime? DataStatus { get; set; }
      }
      

      【讨论】:

      • 当我运行代码时,我得到了以下错误:EntityMemberChanged 或 EntityComplexMemberChanged 被调用,而没有首先在具有相同属性名称的同一更改跟踪器上调用 EntityMemberChanging 或 EntityComplexMemberChanging。有关正确报告更改的信息,请参阅实体框架文档。
      • 是的,但没有帮助。我没有找到任何对我有帮助的东西。我尝试实现 INotifyPropertyChanging 和 INotifyPropertyChanged,但错误保持不变。
      • 您可能不需要实现接口,只需调用成员即可。参考msdn.microsoft.com/en-us/library/…
      【解决方案4】:

      如果您使用带有支持属性的变量,而不是自动属性:

      public class User {
          private byte m_Status;
          private DateTime? m_DataStatus;
      
          public byte Status {
              get { return m_Status; }
              set { m_DataStatus = DateTime.Now; m_Status = value; }
          }
          public DateTime? DataStatus {
              get { return m_DataStatus; }
              set { m_DataStatus = value; }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2011-04-19
        • 2012-04-25
        • 2012-03-22
        • 1970-01-01
        • 2013-05-24
        相关资源
        最近更新 更多