2013-05-10 92 views
9

我從一個實體對象填充一個網格,它顯示數據正常。當我做出更改並將其保存後,沒有任何更新。datagridview綁定到實體沒有更新數據庫

這裏是我的代碼:

在我的加載事件:

var query = from c in _entities.PaymentTypes 
       where c.CorporationId == _currentcorp.CorporationId 
       select 
       new DataBindingProjection 
        { 
        PaymentTypeId = c.PaymentTypeId, 
        CorporationId = c.CorporationId, 
        TokenId = c.TokenId, 
        IsActive = c.IsActive, 
        Description = c.Description, 
        CashChargeCodeType = c.CashChargeCodeType, 
        SortOrder = c.SortOrder, 
        ExcludeCreditCode = c.ExcludeCreditCodes, 
        IsUpdated = c.IsUpdated, 
        IsAdded = c.IsAdded, 
        ClearUpdatedAndAdded = c.ClearUpdateAndAdded 
        }; 
    dataGridView_PaymentTypes.DataSource = query.ToList(); 

我的類:

private class DataBindingProjection 
{ 
    public Guid PaymentTypeId { get; set; } 
    public Guid CorporationId { get; set; } 
    public Guid TokenId { get; set; } 
    public bool IsActive { get; set; } 
    public string Description { get; set; } 
    public int CashChargeCodeType { get; set; } 
    public int SortOrder { get; set; } 
    public int ExcludeCreditCode { get; set; } 
    public bool IsUpdated { get; set; } 
    public bool IsAdded { get; set; } 
    public bool ClearUpdatedAndAdded { get; set; } 
} 

在按鈕保存修改:

private void button_SaveChanges2_Click(object sender, EventArgs e) 
{ 
    button_SaveChanges2.Enabled = false; 
    _entities.SaveChanges(); 
    timer1.Enabled = true; 
    button_SaveChanges2.Enabled = true; 
} 

我究竟做錯了什麼?

響應於bmused:

在類級定義:

private SuburbanPortalEntities _entities; 

在我的負荷定義爲:

var bs = new BindingSource(); 
    _entities.PaymentTypes.Where(x => x.CorporationId == _currentcorp.CorporationId).Load; 
    bs.DataSource = _entities.PaymentTypes.Local.ToBindingList(); 
    dataGridView_PaymentTypes.DataSource = bs; 

據表明它不能加載符號加載和本地:

enter image description here

+0

爲什麼要突出到具有與您的實體完全相同的屬性的另一種類型? – 2013-05-10 22:00:02

+0

測試,我嘗試了幾個不同的想法,我結束了這一點。授予它不需要,但我離開了它。 – ErocM 2013-05-11 03:43:49

+0

should't'Load'是'Load()'? – 2013-05-21 06:11:33

回答

13

與WinForms和實體框架雙向數據綁定可以通過從DbContextLocalObservableCollection<T>創建IBindinglist並將其設置爲BindingSourceDataSource來實現。示例:

private BindingSource bs = new BindingSource(); 
private MyDbContext context = new MyDbContext(); 

context.MyEntities.Where(x=>x.SomeProperty == 2).Load(); 
bs.DataSource = context.MyEntities.Local.ToBindingList(); 
myDataGridView.DataSource = bs; 
+0

對不起,我沒有早點回來,我生病了。無論如何,它說無法解析符號加載或本地。我會將我的代碼放在頂部以供您查看。 – ErocM 2013-05-15 13:58:57

+0

@ErocM什麼版本的實體框架?以上內容適用於EF 4.1+,因爲它使用'DbContext' API而不是舊的'ObjectContext' API。另外檢查你是否參考'System.Data.Entity'。 – 2013-05-15 21:20:14

+0

v4.0.30319您在哪裏以及如何獲得4.1+?我正在使用.net 4.0完整版。 – ErocM 2013-05-15 21:29:11

4

您正在更改實體的預計副本的屬性,而實體本身保持不變。這就是保存不起作用的原因 - 實體保持不變。

您需要將實體本身作爲DataSource綁定到網格,或者在更新投影實例的屬性時更新相應實體的屬性。

1

您正在創建新的DataBindingProjection(),因此我們假設這是一個受上下文權限控制的類?

假設我在代碼中看到的內容是將DataBindingProjection的新實例傳遞給DbContext(如果使用4.2+或ObjectContext,如果使用的是舊版本,則建議遷移到5.0)

在調用SaveChanges()之前,您需要將創建的實體附加()到上下文,我沒有在代碼中看到它。

這是您創建數據庫新記錄的方式。如果要更改數據庫中的記錄,則不應在創建新對象時使用Linq方法,因此應該調用該對象本身,以便它可以擁有EF代理並由EF的ChangeTracker進行跟蹤。

對我來說,你似乎有一個新的班級不被EF跟蹤.....

如果你做了這樣的事情,那麼它應該工作(IM假設一個名爲投影在你的實體的財產,只是一個例子):

var query = from c in _entities.PaymentTypes 
     where c.CorporationId == _currentcorp.CorporationId 
     select c.Projection; 

dataGridView_PaymentTypes.DataSource = query.ToList(); 

如果你沒有,那麼你該做的這樣的事情:

var query = from c in _entities.PaymentTypes 
     where c.CorporationId == _currentcorp.CorporationId 
     new DataBindingProjection 
       { 
       PaymentTypeId = c.PaymentTypeId, 
       CorporationId = c.CorporationId, 
       TokenId = c.TokenId, 
       IsActive = c.IsActive, 
       Description = c.Description, 
       CashChargeCodeType = c.CashChargeCodeType, 
       SortOrder = c.SortOrder, 
       ExcludeCreditCode = c.ExcludeCreditCodes, 
       IsUpdated = c.IsUpdated, 
       IsAdded = c.IsAdded, 
       ClearUpdatedAndAdded = c.ClearUpdateAndAdded 
       }; 

foreach(var item in query) 
    (DbContext)YourInstanceOfContext.Set<DataBindingProjection>().Add(item); 

dataGridView_PaymentTypes.DataSource = query.ToList(); 

在此之後,你將能夠將其保存到數據庫。

2

.Load().Local將可見使用時參考:

using System.Data.Entity;