我的主表名为_(下划线),其名称如下: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)中的错误或者我做错了什么?
答案 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;
这样您就可以避免在代码中对列名进行硬编码。