2010-06-09 84 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 
      }