并非所有Entity属性都由FormView使用的EntityDataSource加载

时间:2009-07-01 00:42:08

标签: asp.net entity-framework data-binding

我正在失去理智。这是一个简单的场景:

实体定义(生成)

// this class is obviously generated by the designer, this is just an example
public class SomeEntity {
  public int SomeEntityID { get; set; } // primary key
  public String Property1 { get; set; }
  public String Property2 { get; set;
}

..在aspx文件中

<asp:EntityDataSource 
ID="EntityDataSource1" runat="server"
ConnectionString="name=Connection" DefaultContainerName="SomeEntities"
EnableDelete="True" EnableInsert="True" EnableUpdate="True"
EntitySetName="SomeEntity" OnUpdating="UpdatingEntity" AutoGenerateWhereClause="true">
<WhereParameters>
  <asp:QueryStringParameter Name="SomeEntityID" QueryStringField="SomeEntityID" Type="Int32"/>
</WhereParameters>
</asp:EntityDataSource>
<asp:FormView runat="server" ID="FormView1" DataSourceID="EntityDataSource1">
   <EditItemTemplate>
    <asp:TextBox runat="server" ID="textbox1" Text='<%# Bind("Property1")%>'
   </EditItemTemplate>
</asp:FormView>

...在代码背后

// ... as per Diego Vega's unwrapping code
public TEntity GetItemObject<TEntity>(object dataItem)
    where TEntity : class
{
    var entity = dataItem as TEntity;
    if (entity != null)
    {
        return entity;
    }
    var td = dataItem as ICustomTypeDescriptor;
    if (td != null)
    {
        return (TEntity)td.GetPropertyOwner(null);
    }
    return null;
}
protected void UpdatingEntity(object sender, EntityDataSourceChangingEventArgs e) {
  SomeEntity entity = GetItemObject<SomeEntity>(e.Entity);
  // at this point entity.Property1 has the value of whatever was entered in the 
  // bound text box, but entity.Property2 is null (even when the field bound to this
  // property in the database contains a value
  // if I add another textbox to form view and bind Property2 to it ... then I can
  // obviously get its value from the entity object above 
 }

基本上,只有表单视图中绑定的属性在Updating事件处理程序中可以使用它们的值,更糟糕的是当我尝试按键从e.Context重新加载实体时,我只会再次获得这些属性。

是什么给出的?如何在Updating事件中访问实体的所有属性? 此外,如果数据源包含Include,那么包含的值在Updating事件中不可用。发生了什么,请帮助!

1 个答案:

答案 0 :(得分:3)

这让我感到沮丧,直到我退后一步并意识到原因。

这是我发现的。仅当属性绑定到对象时,属性才存储在视图状态中。在往返中,只有那些存储的属性从视图状态恢复到实体对象。它是有意义的,因为只有正在使用的数据才真正可用。但是,这并没有考虑到后面代码中实体对象的任何操作。如果您使用Eval而不是Bind:

,也会发生这种情况
<asp:TextBox runat="server" ID="textbox1" Text='<%# Eval("Property1")%>'

这是我使用的解决方法。如果我要在代码隐藏中使用其中一个实体对象属性,我将它绑定到EditItemTemplate中的隐藏字段。完成此操作后,属性将恢复为实体对象,并在代码隐藏中可用。

<asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("Property2") %>'/>