2013-05-10 10 views
9

Ich beziehe ein Raster von einem Entitätsobjekt, und es zeigt die Daten fein an. Wenn ich Änderungen vornehme und sie zurückspare, wird nichts aktualisiert.Bindung von Datagridview an Entität, die Datenbank nicht aktualisiert

Hier ist mein Code:

In meinem Ladeereignis:

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

Meine Klasse:

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

In der um die Änderungen zu speichern:

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

Was mache ich falsch?

Als Reaktion auf bmused:

auf Klassenebene definiert:

private SuburbanPortalEntities _entities; 

in meiner Last definiert:

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

Es zeigt, dass es nicht Symbol laden laden und Lokal:

enter image description here

+0

Warum Sie projizieren zu einem anderen Typ, der genau die gleichen Eigenschaften wie deine Entity hat? –

+0

testen, ich habe mehrere verschiedene Ideen ausprobiert und ich bin damit gelandet. Zugegeben, es ist nicht nötig, aber ich habe es verlassen. – ErocM

+0

sollte 'Load' nicht' Load() 'sein? –

Antwort

13

Zwei-Wege-Datenbindung mit Winforms und Entity Framework kann durch die Schaffung eines von der IBindinglistDbContextLocalObservableCollection<T> und wenn er als DataSource eines BindingSource erreicht werden. Beispiel:

+0

Sorry, ich bin nicht früher zurück gekommen, ich war krank. Wie auch immer, es sagt, dass das Load oder Local nicht aufgelöst werden kann. Ich poste meinen Code oben für deine Bewertung. – ErocM

+0

@ErocM Welche Version von Entity Framework? Das obige sollte für EF 4.1+ funktionieren, da es die 'DbContext'-API und nicht die alte' ObjectContext'-API verwendet. Überprüfen Sie auch, dass Sie auf "System.Data.Entity" verweisen. –

+0

v4.0.30319 wo und wie bekommst du 4.1+? Ich benutze .net 4.0 voll. – ErocM

4

Sie ändern die Eigenschaften der projizierten Kopie der Entität, während die Entität selbst unverändert bleibt. Deshalb funktioniert das Speichern nicht - die Entity bleibt unverändert.

Sie müssen Entitäten entweder selbst als DataSource an das Raster binden oder die Eigenschaft der entsprechenden Entität aktualisieren, wenn Sie die Eigenschaft der Projektionsinstanz aktualisieren.

1

Sie erstellen die neue DataBindingProjection(), also nehmen wir an, dass dies eine Klasse ist, die von Ihrem Kontext gesteuert wird, oder?

Angenommen, dass, was ich sehe, dass in Ihrem Code fehlt, ist, dass Sie die neue Instanz von DataBindingProjection an Ihren DbContext übergeben (wenn 4.2+ oder den ObjectContext verwenden, wenn ältere Versionen verwenden, würde ich 5.0 empfehlen)

Sie müssen die erstellten Entitäten vor dem Aufruf von SaveChanges() an den Kontext anhängen, ich sehe das nicht in Ihrem Code.

Das ist die Möglichkeit für Sie, neue Datensätze in der Datenbank zu erstellen. Wenn Sie Datensätze ändern möchten, die sich in der Datenbank befinden, sollten Sie nicht den Linq-Ansatz verwenden, bei dem Sie ein neues Objekt erstellen. Sie sollten das Objekt selbst aufrufen, damit es die EF-Proxies haben und vom ChangeTracker von EF verfolgt werden kann.

Für mich scheint es, dass Sie eine neue Klasse haben, die nicht von EF verfolgt wird .....

Wenn Sie so etwas wie dies getan haben, dann sollte es funktionieren (im eine Eigenschaft namens Projektion unter der Annahme in Ihrem Wesen zu sein, nur für ein Beispiel):

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

dataGridView_PaymentTypes.DataSource = query.ToList(); 

Wenn Sie nicht, dass dann sollten Sie tun etwas wie dieses:

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

Danach können Sie es in der Datenbank speichern.

2

.Load() und .Local sichtbar sein werden, wenn die Verwendung Referenz:

using System.Data.Entity; 
Verwandte Themen