【问题标题】:DbContext ChangeTracker not working without ForeignKey propertiesDbContext ChangeTracker 在没有 ForeignKey 属性的情况下无法工作
【发布时间】:2016-06-24 21:49:07
【问题描述】:

我在使用 DbContext 的 ChangeTracker 时遇到了问题。 我有一个用外键的属性和数据注释定义的模型。出于业务原因,我不得不为 FluentAPI 更改它,从那时起,ChangeTracker 不再识别导航属性的更改。

当我调用 SaveChanges() 时,标量属性工作得很好,并且导航属性保存在数据库中,但是当我尝试执行以下操作时:

var t = this.Context.ChangeTracker.Entries().Where(
            c => c.State == EntityState.Modified || 
    c.State == EntityState.Added || 
    c.State == EntityState.Deleted
);

调用 t.Any() 总是返回 false。

有没有办法解决这个问题,否则我将不得不返回数据注释?

提前致谢。

编辑 1:

根据 cmets 的要求,我正在展示一个出现问题的类:

public class C016
    {
        #region Fields

        private string _c016Codigo;
        private string _c016Descricao;
        private P029_TipoUnidadeMedida _p029TipoUnidadeMedida;
        private P030_TipoMetricaUnidadeMedida _p030TipoMetricaUnidadeMedida;

        #endregion

        #region Public Properties

        public virtual ObservableCollection<C015_Produto_DadosFiscais> C015_Produto_DadosFiscais { get; set; }

        /// <summary>
        /// Código da Unidade de Medida
        /// </summary>
        [Required, MaxLength(6)]
        [Column(TypeName = "varchar")]
        public string C016_Codigo
        {
            get { return this._c016Codigo; }
            set
            {
                if (value == this._c016Codigo) return;
                this._c016Codigo = value;
            }
        }

        /// <summary>
        /// Descrição da Unidade de Medida
        /// </summary>
        [Required, MaxLength(60)]
        [Column(TypeName = "varchar")]
        public string C016_Descricao
        {
            get { return this._c016Descricao; }
            set
            {
                if (value == this._c016Descricao) return;
                this._c016Descricao = value;
            }
        }

        /// <summary>
        /// Código da Unidade de Medida, Autonumerador
        /// </summary>
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int C016_Id { get; set; }

        public byte P029_Id { get; set; }

        /// <summary>
        /// Tipo da Unidade de Medida, Fracionário ou Inteira
        /// </summary>
        [ForeignKey("P029_Id")]
        public virtual P029_TipoUnidadeMedida P029_TipoUnidadeMedida
        {
            get { return this._p029TipoUnidadeMedida; }
            set
            {
                if (Equals(value, this._p029TipoUnidadeMedida)) return;
                this._p029TipoUnidadeMedida = value;
            }
        }

        /// <summary>
        /// Tipo de métrica da Unidade de medida
        /// </summary>
        [Required]
        public virtual P030_TipoMetricaUnidadeMedida P030_TipoMetricaUnidadeMedida
        {
            get { return this._p030TipoMetricaUnidadeMedida; }
            set
            {
                if (Equals(value, this._p030TipoMetricaUnidadeMedida)) return;
                this._p030TipoMetricaUnidadeMedida = value;
            }
        }

        #endregion
    }

如您所见,我有两个导航属性。一个由 Data Annotations (P029) 设置,另一个 (P030) 由 FluentAPI 设置在其他位置。 在我的 WPF 窗口中,我有两个组合框,每个导航属性一个。当我将 de "P029" 更改为 1 时,ChangeTracker 返回 1 个更改的条目,但是当我将 de "P030" 更改为 1 时,什么也没有发生。

【问题讨论】:

  • 你能展示一个数据注释映射与流利的例子吗?以及应该更改导航属性的代码?

标签: c# entity-framework


【解决方案1】:

我找到了解决方案。而不是使用:

var t = this.Context.ChangeTracker.Entries()
            .Where(c => c.State == EntityState.Modified || 
                c.State == EntityState.Added || 
                c.State == EntityState.Deleted);

return t.Any();

我用过:

return this.Context.ChangeTracker.HasChanges();

现在一切正常。

【讨论】:

  • 按照这些思路,我目前正在谷歌搜索,试图找出由 ChangeTracker 跟踪的哪些实体对象实际上需要保存更改(我已经修改了一个子集合),尽管实体的状态为 Unchanged...
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 2012-12-21
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多