2010-12-28 10 views
3

私はGridViewをEntityDataSourceに接続しています。'System.Data.Objects.MaterializedDataRecord'タイプのオブジェクトをキャストできません

EntityDataSourceには、Where Parametersの内部パラメータがあります。この時点まですべてがうまくいきます。

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

私はイベントを使用するには、すべての単一の行の値を取得し、いくつかのロジックを実行するためにEntity FrameworkのをRowDataBound。

できるだけ早く私は、私はこのエラーが発生したコードの実行として:EntityDataSourceのSMTにパラメータを追加するとき

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

をそれは私には思われるので、私はすべてのアイデア 以前のようにEFを使用することはできませんよ変化していますか?みんなありがとう! RowDataBoundイベントでEntityDataSourceを結合上


 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

コードを改行することは実際には不可能です。 –

+0

これに関するご意見は? – GibboK

答えて

1

読むディエゴ・ベガのブログ記事:

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

あなたは「ラッピングするためのルール」の彼の第四のシナリオに実行されています。

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.

ソースエンティティを取得することはできません。あなたはDataItemをDataRowのように扱わなければなりません。

If e.Row.RowType = DataControlRowType.DataRow Then 

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

    Dim myUserID As Integer = rowCmsAuthor("UserId") 

End If 

また、SelectプロパティをEntityDataSourceから削除することもできます。ラップのためのディエゴのルールのシナリオ1または2を使用してみてください。

関連する問題