1

我有一个 EntityDataSource 试图替换一些以前的代码隐藏工作。我的 EntityDataSource 看起来像:

    <asp:EntityDataSource 
        runat="server" 
        ID="personDataSource" 
        ContextTypeName="Model.GuidesEntities" 
        EntitySetName="CharacterFavorites" 
        OrderBy="it.Person.FullName" 
        Select="it.Person.Id" 
        Where="it.UserName = @userName" />

当我实际使用它时,我得到了错误:

在当前加载的架构中,“Person”不是“Transient.rowtype[(Id,Edm.Int32(Nullable=True,DefaultValue=))]”类型的成员。

EntityDataSource 不支持走关系吗?您将如何使用 EntityDataSource 执行此操作?

@userName参数现在也被添加到后面的代码中。任何知道如何直接在 WhereParameters 集合中指定用户名参数的人都可以加分。

4

3 回答 3

2

EF 在这里使用“超级延迟加载”(我自己的术语)。它不会自动伸出手来抓取相关的“Person”对象。您必须在 entotyDataSource 中指定要提供哪些其他对象。所以你需要添加这一行:“Include="Person"。见下文:

 <asp:EntityDataSource 
        runat="server" 
        ID="personDataSource" 
        ContextTypeName="Model.GuidesEntities" 
        EntitySetName="CharacterFavorites" 
        OrderBy="it.Person.FullName" 
        Select="it.Person.Id" 
        Where="it.UserName = @userName" 
        Include="Person"  />

如果您需要添加多个关联,请用逗号分隔它们: Include="Person, Dog, Chicken, SalesOrder" 此外,在 Where 子句中它是“==”而不是“=”。

于 2011-02-11T21:28:55.350 回答
1

没有标准的预定义参数类型允许您将当前用户名作为标记中的 Where 参数(我猜您正在谈论User.Identity.Name)。一些简单的东西,比如...

<asp:Parameter Name="userName" DefaultValue='<%# User.Identity.Name %>' />

...不幸的是,它不起作用,因为您不能在参数控件中使用数据绑定语法。

但是您可以创建自定义参数。(该页面的后半部分是“用户名参数”的具体示例。)

对于您的例外问题:我在 EntityDataSource 中大量使用带有导航属性的“it-Syntax”,它看起来或多或少与您的示例完全一样。在没有看到更多模型的情况下,很难说出可能导致错误的原因。但一般来说,浏览 EntityDataSource 中的属性是受支持的并且可以工作。

于 2010-06-12T14:26:36.427 回答
0
   protected void MyNotesSelecting(object sender, EntityDataSourceSelectingEventArgs e)
            {
                e.DataSource.Where = "it.UserName=="+User.Identity.Name
            }
于 2012-01-27T14:37:04.193 回答