2013-05-10 7 views
9

Sto compilando una griglia da un oggetto entità e sta visualizzando i dati fini. Quando apporto le modifiche e le salvo, nulla si sta aggiornando.datagridview associazione all'entità che non aggiorna il database

Ecco il mio codice:

Nel mio caso in carico:

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

La mia classe:

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

Nel pulsante per salvare le modifiche:

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

Che cosa sto facendo di sbagliato?

In risposta a bmused:

definita a livello di classe:

private SuburbanPortalEntities _entities; 

definito nel mio carico:

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

Si sta dimostrando che esso non può caricare il simbolo di carico e Locale:

enter image description here

+0

Perché stai proiettando ad un altro tipo che ha le stesse identiche proprietà della tua entità? –

+0

test, ho provato diverse idee e ho finito con questo. Certo, non è necessario ma l'ho lasciato. – ErocM

+0

non dovrebbe essere 'Load' be' Load() '? –

risposta

13

bidirezionale databinding con Winforms e Entity Framework può essere ottenuta creando un IBindinglist dal DbContextLocalObservableCollection<T> e impostarlo come DataSource di un BindingSource. Esempio:

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

Scusa se non sono tornato prima, ero malato. Comunque, dice che non può risolvere il simbolo Load o Local. Pubblicherò il mio codice in alto per la tua recensione. – ErocM

+0

@ErocM quale versione di Entity Framework? Quanto sopra dovrebbe funzionare per EF 4.1+ poiché usa l'API 'DbContext' non la vecchia API' ObjectContext'. Controlla anche di fare riferimento a 'System.Data.Entity'. –

+0

v4.0.30319 dove e come si ottiene 4.1+? Sto usando .net 4.0 completo. – ErocM

4

Si cambiano le proprietà della copia proiettata dell'entità, mentre l'entità stessa rimane invariata. Ecco perché il salvataggio non funziona - l'entità rimane invariata.

È necessario associare le entità stesse come DataSource alla griglia o aggiornare la proprietà dell'entità corrispondente quando si aggiorna la proprietà dell'istanza di proiezione.

1

Stai creando il nuovo DataBindingProjection(), quindi stiamo assumendo che questa sia una classe controllata dal contesto giusto?

Supponendo che, quello che vedo che manchi nel codice è che tu passi la nuova istanza di DataBindingProjection sul tuo DbContext (se usi 4.2+ o su ObjectContext se usi versioni precedenti, ti consiglio di migrare a 5.0)

È necessario collegare() le entità create al contesto prima di chiamare SaveChanges(), non lo vedo nel codice.

È il modo per creare nuovi record nel database. Se vuoi cambiare i record che si trovano nel database, non dovresti usare l'approccio Linq dove crei un nuovo oggetto, dovresti chiamare l'oggetto stesso, in modo che possa avere i proxy EF e essere rintracciato dal ChangeTracker di EF.

Per me sembra che tu abbia una nuova classe che non viene monitorata da EF .....

Se avete fatto qualcosa di simile, allora dovrebbe funzionare (im assumendo una proprietà denominata proiezione di essere nelle vostre entità, solo per un esempio):

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

dataGridView_PaymentTypes.DataSource = query.ToList(); 

se non avete che allora si dovrebbe fare qualcosa di simile:

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

Dopo questo sarà possibile salvarlo nel database.

2

.Load() e .Local saranno visibili quando l'uso di riferimento:

using System.Data.Entity;