DbContext ChangeTracker在没有ForeignKey属性的情况下无法正常工作

时间:2013-11-21 13:46:20

标签: c# entity-framework

我对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:

根据评论的要求,我正在显示出现问题的课程:

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
    }

如您所见,我有两个导航属性。一个由数据注释(P029)设置,另一个(P030)由FluentAPI设置在其他地方。 在我的WPF窗口中,我有两个ComboBox,每个导航属性一个。当我更改de“P029”时,ChangeTracker返回1个更改的条目,但是当我更改de“P030”时,没有任何反应。

1 个答案:

答案 0 :(得分:0)

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

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();

现在一切正常。