2013-05-10 13 views
9

Zapełniam siatkę z obiektu encji i wyświetlam dane w porządku. Kiedy wprowadzam zmiany i zapisuję je, nic się nie aktualizuje.wiązanie datagridview z jednostką, która nie aktualizuje bazy danych

Oto mój kod:

W moim przypadku obciążenia:

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

Moja klasa:

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; } 
} 

w przycisku, aby zapisać zmiany:

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

Co ja robię źle?

W odpowiedzi na bmused:

zdefiniowane na poziomie klasy:

private SuburbanPortalEntities _entities; 

zdefiniowane w moim obciążenia:

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

To pokazuje, że nie można załadować symbol obciążenia i Lokalny:

enter image description here

+0

Czemu projekcyjny do innego typu, który ma dokładnie te same właściwości twojej istoty? –

+0

testowałem, próbowałem kilku różnych pomysłów i skończyło się to. To prawda, że ​​nie jest to potrzebne, ale zostawiłem to. – ErocM

+0

should't 'Load' be' Load() '? –

Odpowiedz

13

Dwukierunkowe wiązania z danymi z WinForm i jednostek ram może być osiągnięty poprzez utworzenie IBindinglist z DbContextLocalObservableCollection<T> i ustawienie go jako DataSource z BindingSource. Przykład:

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

Przepraszam, że nie wróciłem wcześniej, byłem chory. W każdym razie jest napisane, że nie można rozwiązać symbolu Load lub Local. Wyślę mój kod do góry dla twojej recenzji. – ErocM

+0

@ErocM jaka wersja Entity Framework? Powyższe powinno działać dla EF 4.1+, ponieważ używa API 'DbContext', a nie starego API' ObjectContext'. Sprawdź również, czy odwołujesz się do 'System.Data.Entity'. –

+0

v4.0.30319 gdzie i jak otrzymujesz 4.1+? Używam .net 4.0 pełne. – ErocM

4

Zmieniasz właściwości projektowanej kopii obiektu, a sam obiekt pozostaje niezmieniony. Dlatego zapis nie działa - obiekt pozostaje niezmieniony.

Potrzebujesz albo powiązać obiekty jako źródło danych do siatki, albo zaktualizować właściwość odpowiedniego obiektu podczas aktualizowania właściwości instancji projekcji.

1

Tworzysz nowy obiekt DataBindingProjection(), więc zakładamy, że jest to klasa kontrolowana przez twój kontekst, prawda?

Zakładając, że brakuje tego w kodzie, należy przekazać nowe wystąpienie DataBindingProjection do DbContext (jeśli używasz wersji 4.2+ lub do ObjectContext jeśli korzystasz ze starszych wersji, polecam migrację do wersji 5.0)

Musisz załączyć() utworzone obiekty do kontekstu przed wywołaniem SaveChanges(), nie widzę tego w twoim kodzie.

Jest to sposób na tworzenie nowych rekordów w bazie danych. Jeśli chcesz zmienić rekordy znajdujące się w bazie danych, nie powinieneś używać metody Linq, w której tworzysz nowy obiekt, powinieneś wywołać sam obiekt, aby mógł mieć proxy pośredniczące EF i być śledzony przez ChangeTracker z EF.

Wydaje mi się, że masz nową klasę, która nie jest śledzona przez EF .....

Jeśli zrobiłeś coś takiego, to powinno działać (im zakładając właściwość o nazwie Projekcja być w swoich jednostkach, tylko dla przykładu):

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

dataGridView_PaymentTypes.DataSource = query.ToList(); 

Jeśli nie masz, że to należy zrobić coś takiego:

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

Po tym będzie można zapisać go do bazy danych.

2

.Load() i .Local będą widoczne, gdy odniesienie zastosowanie:

using System.Data.Entity; 
Powiązane problemy