これは私の質問を示すためのテスト プロジェクトです。(VS2012、WinForms、EntityFramework 5、XtraGrid 12.5)
EF PowerTools - リバース エンジニアリング CodeFirst ツールによって作成されたモデル。
timer1_tick イベントで、mypoco.value プロパティを変更しています。grid.cell がこの変更を自動的に表示することを期待していますが、そうではありません。テキストボックスも試しましたが同じでした。
BindingSource.ResetCurrentItem()
timer1_tick でコメントを外すと期待どおりに動作しますが、これは私の質問ではありません。グリッド(またはテキストボックス)を強制的に更新すると、すべて問題ありません。
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());
}
}