将SubSonic集合绑定到下拉列表时,datasouruce问题中不存在列

时间:2009-05-15 13:38:54

标签: asp.net subsonic data-access-layer

我的主表名为_(下划线),其名称如下:User_Id。当SubSonic生成DAL时,它会删除下划线。现在我将对象集合绑定到DropDownList,如下所示:

private void LoadCbo()
{
    UserCollection users=(new UserCollection()).Load();
    User u=new User(){
        UserId=-1,
        Name="[Select]"};
   users.Insert(0,u);

   ddlUsers.DataSource=users;
   ddlUsers.DataValueField=User.Columns.UserId;
   ddlUsers.DataTextField=User.Columns.Name;
   ddUsers.DataBind();    
}

运行时告诉我该对象不包含名为“User_Id”的列。

PS: - 使用“UserId”工作正常。我只是想知道这是否是SubSonic(2.1)中的错误或者我做错了什么?

2 个答案:

答案 0 :(得分:2)

Columns集合由数据库中的列名组成,而不是对象的属性名。这不是一个错误,它是一个必不可少的功能,否则SubSonic将不知道如何查询实际的数据库。

以下行指定在填充下拉列表时使用的属性:

ddlUsers.DataValueField=User.Columns.UserId;  

User.Columns.UserId的值为“User_Id”,它是数据库表中列的名称,而不是属性的名称。但是,当ddlUsers进行数据绑定时,它无法找到名为User_Id的User对象的属性,因为当SubSonic生成DAL时,它会从属性名称中删除下划线。最好的解决办法是(正如ranomore所指出的那样):

ddlUsers.DataValueField = User.UserIdColumn.PropertyName;  

答案 1 :(得分:1)

在SubSonic 2.2中,您也可以这样做:

ddlUsers.DataValueField = User.UserIdColumn.PropertyName;

这样您就可以避免在代码中对列名进行硬编码。