通过BindingSource绑定到EntityFramework Poco类的网格不会自动刷新

本文关键字:网格 刷新 绑定 BindingSource EntityFramework Poco 通过 | 更新日期: 2023-09-27 18:25:25

这是一个测试项目,用来展示我的问题。(VS2012,WinForms,EntityFramework 5,XtraGrid 12.5)

EF PowerTools创建的模型-逆向工程CodeFirst工具。

在timer1_tick事件中,我正在更改mypoco.value属性。我希望grid.cell会自动显示这些更改,但不会。我也尝试过使用textbox,但还是一样。

如果我在timer1_tick中取消注释BindingSource.ResetCurrentItem(),这是意料之中的事,但这不是我的问题。如果我强制使用网格(或文本框)来刷新,一切都很好。

我希望ef创建的代理对象通过接口、方法或继承或我不知道的方式通知DbSet.Local(ObservableCollection)->BindingList->BindingSource->Grid等。。。我在问这个通知系统,为什么不起作用?或者它是有效的,但我的期望是错误的?(

为什么这没有按预期工作,我在哪里失败了?还请阅读代码中的注释。

谢谢。

//FORM CODE    
public partial class Form1 : Form
{
    testContext context = new testContext();
    MyPOCO mypoco;

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        mypoco = context.MyPOCOes.Create();
        // mypoco is created but not proxied currently. state = detached
        // After adding it context proxy created and change tacking will be available
        context.MyPOCOes.Add(mypoco);
        // mypoco is in the memory but not saved to database. This is why using Local 
        myPOCOBindingSource.DataSource = context.MyPOCOes.Local.ToBindingList();
        // Setup timer
        timer1.Interval = 15 * 1000;
        timer1.Start();
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the property and then warn user about this event occured 
        // At this point mypoco is proxied
        mypoco.Value = 99;
        this.Text = "Timer Tick";
        //myPOCOBindingSource.ResetCurrentItem();
    }
}
// some code from Form1.Designer file
private System.Windows.Forms.BindingSource myPOCOBindingSource;
private void InitializeComponent()
{
   this.myPOCOBindingSource = new System.Windows.Forms.BindingSource();
   ....
   this.myPOCOGridControl.DataSource = this.myPOCOBindingSource;
}


//MYPOCO
public partial class MyPOCO
{
    public int ID { get; set; }
    public Nullable<int> Value { get; set; }
}

//MAPPING
public class MyPOCOMap : EntityTypeConfiguration<MyPOCO>
{
    public MyPOCOMap()
    {
        // Primary Key
        this.HasKey(t => t.ID);
        // Table & Column Mappings
        this.ToTable("MyPOCO");
        this.Property(t => t.ID).HasColumnName("ID");
        this.Property(t => t.Value).HasColumnName("Value");
    }
}

//CONTEXT
public partial class testContext : DbContext
{
    static testContext()
    {
        Database.SetInitializer<testContext>(null);
    }
    public testContext()
        : base("Name=testContext")
    {
    }
    public DbSet<MyPOCO> MyPOCOes { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MyPOCOMap());
    }
}

通过BindingSource绑定到EntityFramework Poco类的网格不会自动刷新

MyPoco的代理代码在这里:与绑定无关(当然)。。。

public sealed class MyPOCO_F874E881B0FD3EF02199CD96C63396B451E275C5116C5DFBE892C68733857FDE : MyPOCO, IEntityWithChangeTracker, IEntityWithRelationships
{
    [NonSerialized]
    private IEntityChangeTracker _changeTracker;
    private static Func<object, object, bool> _compareByteArrays;
    [NonSerialized, IgnoreDataMember, XmlIgnore, ScriptIgnore]
    public object _entityWrapper;
    private System.Data.Objects.DataClasses.RelationshipManager _relationshipManager;
    private static Action<object> _resetFKSetterFlag;
    private void EntityMemberChanged(string text1)
    {
        if (this._changeTracker != null)
        {
            this._changeTracker.EntityMemberChanged(text1);
        }
    }
    private void EntityMemberChanging(string text1)
    {
        if (this._changeTracker != null)
        {
            this._changeTracker.EntityMemberChanging(text1);
        }
    }
    public void SetChangeTracker(IEntityChangeTracker tracker1)
    {
        this._changeTracker = tracker1;
    }
    public override int ID
    {
        get
        {
            return base.ID;
        }
        set
        {
            if (base.ID != value)
            {
                try
                {
                    this.EntityMemberChanging("ID");
                    base.ID = value;
                    this.EntityMemberChanged("ID");
                }
                finally
                {
                    _resetFKSetterFlag(this);
                }
            }
        }
    }
    public System.Data.Objects.DataClasses.RelationshipManager RelationshipManager
    {
        get
        {
            if (this._relationshipManager == null)
            {
                this._relationshipManager = System.Data.Objects.DataClasses.RelationshipManager.Create(this);
            }
            return this._relationshipManager;
        }
    }
    public override int? Value
    {
        get
        {
            return base.Value;
        }
        set
        {
            try
            {
                this.EntityMemberChanging("Value");
                base.Value = value;
                this.EntityMemberChanged("Value");
            }
            finally
            {
                _resetFKSetterFlag(this);
            }
        }
    }
}