2010-12-28 12 views
3

nicht umwandeln Ich habe ein GridView mit der EntityDataSource verbunden.Kann Objekt vom Typ 'System.Data.Objects.MaterializedDataRecord'

EntityDataSource hat einen internen Parameter für Where Parameters. Alles funktioniert gut bis zu diesem Punkt.

<asp:EntityDataSource ID="EntityDataSourceListAuthors" runat="server" ConnectionString="name=CmsConnectionStringEntityDataModel" 
     DefaultContainerName="CmsConnectionStringEntityDataModel" EnableFlattening="False" 
     EntitySetName="CmsAuthors" EntityTypeFilter="" OrderBy="it.FirstName" Select="it.AuthorId, it.UserId, it.FirstName, it.LastName, it.NoteInternal, it.ContentAuthor" 
     Where="it.UserId = @ActiveUser"> 
    </asp:EntityDataSource> 

Ich verwende ein Ereignis ein Entity Framework RowDataBound einen Wert für jede einzelne Zeile abzurufen und einige Logik auszuführen.

Sobald ich den Code ausführen erhalte ich diesen Fehler:

Unable to cast object of type 'System.Data.Objects.MaterializedDataRecord' to type 'WebProject.DataAccess.DatabaseModels.CmsAuthor'. 

Es scheint mir, als Parameter zu EntityDataSource smt Zugabe verändert sich so in der Lage bin ich nicht EF als Jede Idee vor zu benutzen? Danke Leute!


 protected void uxListAuthorsDisplayer_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
      switch (e.Row.RowType) 
      { 
       // In case type of row is DataRow (a data row of GridView) 
       case DataControlRowType.DataRow: 
        // Display friendly User's Name instead of his Guid 
        // Retrive underlying data from a single row rappresented in GridView (use Entity Framwork)     
        WebProject.DataAccess.DatabaseModels.CmsAuthor myRow = (WebProject.DataAccess.DatabaseModels.CmsAuthor)e.Row.DataItem; 
        // Retrive the Guid for a User in a specific row 
        Guid myUserGuid = (Guid)myRow.UserId; 
        // Find out used UserName using Guid UserId 
        MembershipUser mySelectedUser = Membership.GetUser(myUserGuid); 
        // Write friendly User's Name instead of his Guid value in a specific Grid View Cell 
        e.Row.Cells[3].Text = mySelectedUser.UserName; 

        // Disable Delete Button if a Content has associated an Author 
        // Use Entity Framwork for retriving data - Create a "Context" for a single Row 
        using (CmsConnectionStringEntityDataModel context = new CmsConnectionStringEntityDataModel()) 
        { 
         // Find out Row Id and create an varaible to store it 
         int myWorkingRowId = myRow.AuthorId; 
         // Find the Edit Link 
         HyperLink myEditLink = (HyperLink)e.Row.FindControl("uxLinkEditButton"); 
         // Find the Delete Button 
         LinkButton myDeleteButton = (LinkButton)e.Row.FindControl("uxLinkDeleteButton"); 
         // Find the System Note Label 
         Label mySystemNote = (Label)e.Row.FindControl("uxSystemNoteDisplayer"); 
         // Use of Lamba Espression with EF to check if an Author is associated with a Content 
         CmsContent authorIdInContent = context.CmsContents.FirstOrDefault(x => x.AuthorId == myWorkingRowId); 
         // Make visible or invisible the Delete Button if an Author is associated to a Content 
         if (authorIdInContent != null) 
         { 
          myDeleteButton.Visible = false; 
          mySystemNote.Text = "Author is being used in Contents"; 
         } 
         else 
         { 
          myDeleteButton.Visible = true; 
         } 

         // Programmatically Limiting Functionality depending on User's Roles 
         myEditLink.Visible = User.IsInRole("CMS-ADMINISTRATOR") || User.IsInRole("CMS-AUTHOR") || User.IsInRole("CMS-EDITOR"); 
         myDeleteButton.Visible = User.IsInRole("CMS-ADMINISTRATOR"); 
        } 
        break; 
      } 
     } 
+0

Wickeln Sie Ihren Code ist wirklich nicht lesbar. –

+0

irgendeine Idee zu diesem Thema? – GibboK

Antwort

1

lesen Diego Vega Blog-Post auf EntityDataSource im RowDataBound Ereignisbindung:

http://blogs.msdn.com/b/diego/archive/2008/05/13/entitydatasource-to-wrap-or-not-to-wrap.aspx

Sie führen in das vierte Szenario seiner "Regeln für die Verpackung".

Finally, if you set the Select property to do a projection (i.e. "it.CustomerID, it.CustomerName", you get DbDataRecord regardless of how you start your query.

Sie können die Quellenentität nicht abrufen. Sie müssen Ihr DataItem als etwas wie eine DataRow behandeln.

If e.Row.RowType = DataControlRowType.DataRow Then 

    Dim rowCmsAuthor = CType(e.Row.DataItem, Data.Common.DbDataRecord) 

    Dim myUserID As Integer = rowCmsAuthor("UserId") 

End If 

Alternativ können Sie in der Lage sein, nur die Select Eigenschaft von Ihrem EntityDataSource zu entfernen. Versuchen Sie, Szenario 1 oder 2 von Diegos Regeln für das Wrapping zu verwenden.

Verwandte Themen