2009-07-01 1 views
1

Ich verliere meinen Verstand. Es ist ein einfaches Szenario:Nicht alle von EntityDataSource geladenen Entity-Eigenschaften, die von FormView verwendet werden

Entity-Definition (erzeugt)

// this class is obviously generated by the designer, this is just an example 
public class SomeEntity { 
    public int SomeEntityID { get; set; } // primary key 
    public String Property1 { get; set; } 
    public String Property2 { get; set; 
} 

.. in aspx Datei

<asp:EntityDataSource 
ID="EntityDataSource1" runat="server" 
ConnectionString="name=Connection" DefaultContainerName="SomeEntities" 
EnableDelete="True" EnableInsert="True" EnableUpdate="True" 
EntitySetName="SomeEntity" OnUpdating="UpdatingEntity" AutoGenerateWhereClause="true"> 
<WhereParameters> 
    <asp:QueryStringParameter Name="SomeEntityID" QueryStringField="SomeEntityID" Type="Int32"/> 
</WhereParameters> 
</asp:EntityDataSource> 
<asp:FormView runat="server" ID="FormView1" DataSourceID="EntityDataSource1"> 
    <EditItemTemplate> 
    <asp:TextBox runat="server" ID="textbox1" Text='<%# Bind("Property1")%>' 
    </EditItemTemplate> 
</asp:FormView> 

... in Code hinter

// ... as per Diego Vega's unwrapping code 
public TEntity GetItemObject<TEntity>(object dataItem) 
    where TEntity : class 
{ 
    var entity = dataItem as TEntity; 
    if (entity != null) 
    { 
     return entity; 
    } 
    var td = dataItem as ICustomTypeDescriptor; 
    if (td != null) 
    { 
     return (TEntity)td.GetPropertyOwner(null); 
    } 
    return null; 
} 
protected void UpdatingEntity(object sender, EntityDataSourceChangingEventArgs e) { 
    SomeEntity entity = GetItemObject<SomeEntity>(e.Entity); 
    // at this point entity.Property1 has the value of whatever was entered in the 
    // bound text box, but entity.Property2 is null (even when the field bound to this 
    // property in the database contains a value 
    // if I add another textbox to form view and bind Property2 to it ... then I can 
    // obviously get its value from the entity object above 
} 

grundsätzlich nur die Eigenschaften In der Formularansicht gebundene Werte sind im Updating-Ereignishandler verfügbar, schlimmer noch, wenn ich versuche Laden Sie die Entity von e.Context nach Schlüssel neu, ich bekomme nur diese Eigenschaften wieder.

Was gibt? Wie kann im Updatereignis auf alle Eigenschaften der Entität zugegriffen werden? Auch wenn die Datenquelle Include enthält, sind diese eingeschlossenen Werte im Aktualisierungsereignis NICHT verfügbar. Was ist los, bitte HILFE!

Antwort

3

Das frustrierte mich auch, bis ich zurücktrat und den Grund dafür erkannte.

Hier ist, was ich gefunden habe. Die Eigenschaften werden nur dann im Ansichtszustand gespeichert, wenn sie an ein Objekt gebunden sind. Auf dem Umlauf werden nur die gespeicherten Eigenschaften vom Ansichtszustand in das Entitätsobjekt zurückgeschrieben. Dies kann sinnvoll sein, da nur die Daten verfügbar sind, mit denen gearbeitet wird. Dies berücksichtigt jedoch keine Manipulation des Entitätsobjekts im nachfolgenden Code. Dies passiert auch, wenn Sie Eval anstelle von Bind verwenden:

<asp:TextBox runat="server" ID="textbox1" Text='<%# Eval("Property1")%>' 

Hier ist die Problemumgehung, die ich verwende. Wenn ich eine der Entitätsobjekteigenschaften im Code-Behind verwenden werde, binde ich sie an ein verstecktes Feld in der EditItemTemplate. Sobald ich dies getan hatte, wurden die Eigenschaften im Entity-Objekt wiederhergestellt und im Code-Behind verfügbar.

<asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("Property2") %>'/> 
+0

Ja, ich habe es später selbst herausgefunden. Ich denke es ist scheiße, aber naja. Du solltest das Karma bekommen, damit andere Leute, die nach einer Antwort suchen, es bekommen können. Prost! – Strelok