【问题标题】:Property value changes without setter being called属性值更改而不调用 setter
【发布时间】:2021-04-23 19:31:10
【问题描述】:

我正在使用上下文类进行需要插入记录的项目。但是,在插入之前,“DataArea”属性之一被设置为它不应该具有的值。

我开始调试代码以查看该值的确切设置位置,并将 getter 和 setter (get; set;) 的简短书面版本更改为:

public DataAreaEnum _DataArea;
public DataAreaEnum DataArea
    {
        get
        {
            return _DataArea;
        }
        set
        {
            _DataArea = value;
            Debugger.Break();
        }
    }

通过这样做,我希望调试器在设置值时会中断,但是这永远不会发生。我被困住了,不知道该怎么想。有没有其他方法可以设置这个值?如果设置器中的断点从未被命中,我如何才能找到该值的设置位置?

完整的类代码:

using Works.Common.Models;
using System.Collections.Generic;
using System.Diagnostics;

namespace Works.Models.Toolsheets
{
    public partial class Toolblad : ModelBase
    {
        public Toolblad()
        {
            Bijlagen = new HashSet<Bijlage>();
            //Carrousels = new HashSet<Carrousel>();
            KlauwplaatSlijpers = new HashSet<KlauwplaatSlijper>();
            Klauwplaten = new HashSet<Klauwplaat>();
            Laadtafels = new HashSet<Laadtafel>();
            Laders = new HashSet<Lader>();
            MblStangenLaders = new HashSet<MblStangenLader>();
            MblStangenLaderWisselpunten = new HashSet<MblStangenLaderWisselpunt>();
            Shuttles = new HashSet<Shuttle>();
            Spankoppen = new HashSet<Spankop>();
            SpankopSlijpers = new HashSet<SpankopSlijper>();
            Revolvers = new HashSet<ToolbladRevolver>();
        }

        public DataAreaEnum _DataArea;
        public DataAreaEnum DataArea
        {
            get
            {
                return _DataArea;
            }
            set
            {
                _DataArea = value;
                Debugger.Break();
            }
        }

        public bool IsTemplate { get; set; }

        #region Navigation Properties

        public virtual AlgemeneInfo AlgemeneInfo { get; set; }

        public int AlgemeneInfoId { get; set; }

        public ICollection<Bijlage> Bijlagen { get; set; }

        //public ICollection<Carrousel> Carrousels { get; set; }

        public ICollection<KlauwplaatSlijper> KlauwplaatSlijpers { get; set; }

        public ICollection<Klauwplaat> Klauwplaten { get; set; }

        public ICollection<Laadtafel> Laadtafels { get; set; }

        public ICollection<Lader> Laders { get; set; }

        public MachineGroep MachineGroep { get; set; }

        public int MachineGroepId { get; set; }

        public ICollection<MblStangenLader> MblStangenLaders { get; set; }

        public ICollection<MblStangenLaderWisselpunt> MblStangenLaderWisselpunten { get; set; }

        public ICollection<ToolbladRevolver> Revolvers { get; set; }

        public ICollection<Shuttle> Shuttles { get; set; }

        public ICollection<Spankop> Spankoppen { get; set; }

        public ICollection<SpankopSlijper> SpankopSlijpers { get; set; }

        #endregion Navigation Properties
    }
}

【问题讨论】:

  • public DataAreaEnum _DataArea; 那应该是私有的。
  • 将此设置为私有后,问题仍然存在。该值似乎仍在设置中。
  • 我注意到 Toolblad 是一个部分类。其他地方是否有任何代码更改_DataArea?尝试在该代码文件中将其重命名为其他名称(例如_dataArea),看看它是否仍然可以编译。
  • 设置的值是多少?如果是枚举,则默认为 0。See here for details
  • 我猜你正在使用EFCore(为什么不标记它?),所以看起来属性访问模式是Field,所以属性的getter和setter被完全绕过了。尝试为整个类型 Toolblad (如 modelBuilder.Entity&lt;Toolblad&gt;().UsePropertyAccessMode(PropertyAccessMode.Property))或您选择的每个特定属性进行配置。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

无论您是否设置 Enum 的值,它都默认为 0,这就是为什么您在没有设置值的情况下看到它的值。

【讨论】:

    【解决方案2】:

    我注意到 Toolblad 是一个部分类。其他地方是否有任何代码更改_DataArea?尝试在该代码文件中将其重命名为其他名称(例如 _dataArea),看看是否仍然可以编译。

    这样做会捕获任何试图访问它的意外代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多