2010-06-09 29 views
1

我有一个EntityDataSource,我试图替换一些以前的代码隐藏工作。我EntityDataSource样子:EntityDataSource是否支持“it.Property.Property”语法?

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

当我真正使用它,我得到的错误:

'Person' is not a member of type 'Transient.rowtype[(Id,Edm.Int32(Nullable=True,DefaultValue=))]' in the currently loaded schemas.

是否EntityDataSource不支持行走的关系?你将如何与EntityDataSource做到这一点?

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

回答

1

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

​​

...因为你不能使用数据的参数控制绑定语法不遗憾的是工作。您可以创建custom parameters。 (该页面的后半部分是一个“用户名参数”的具体示例。)

针对您的例外问题:我在EntityDataSource中使用了带有导航属性的“it-Syntax”,并且它看起来或多或少像你的例子。如果没有看到更多的模型,很难说出可能导致错误的原因。但通常,通过EntityDataSource中的属性进行导航是受支持的并且可行。

2

EF在这里使用“超级延迟加载”(我自己的术语)。它不会自动伸出并抓住关联的“Person”对象。你必须在EntotyDataSource中指定其他可用的对象。所以,你需要加入这一行:“请看下图:

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

如果需要添加多个关联,他们用逗号分隔:包括=‘“包括=”人的人,狗,鸡,SalesOrder’ 你的Where子句中的“==”不是“=”

+0

刚才我指出,如果你还在你的Include属性中包含“Dog”对象,并且还想要它是“Collar”导航属性,然后你添加“Dog.Collar”到Include中,“Collar”本身就会中断 – Graham 2011-03-03 18:02:31

+0

这是正确的答案(it.NavigationProperty.Field)。在数据中使用它稍后绑定表达式,只使用字段名称,而不是NavigationProperty.Field来绑定数据。这使我绊倒了。 – kappasims 2011-05-12 14:55:04

+0

我想我应该澄清,否则它似乎会与格雷厄姆在他的评论中所说的相矛盾。如果我们要从上面的格雷厄姆选择中去掉,那么它应该被评估为Eval(“Id”)。 – kappasims 2011-05-12 14:56:54

0
protected void MyNotesSelecting(object sender, EntityDataSourceSelectingEventArgs e) 
      { 
       e.DataSource.Where = "it.UserName=="+User.Identity.Name 
      }