Столбец не существует в проблеме с источником данных при привязке коллекции SubSonic к выпадающему - PullRequest
0 голосов
/ 15 мая 2009

У меня есть таблица с первичным ключом с _ (подчеркивание) в названии, например: 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 ]

2 голосов
/ 15 мая 2009

Коллекция Columns состоит из имен столбцов в базе данных, а не имен свойств объекта. Это не ошибка, это важная часть функциональности, иначе SubSonic не будет знать, как запросить фактическую базу данных.

В следующей строке указывается, какое свойство использовать при заполнении значения раскрывающегося списка:

ddlUsers.DataValueField=User.Columns.UserId;  

Значением User.Columns.UserId будет «User_Id», это имя столбца в таблице базы данных, а не имя свойства. Однако, когда ddlUsers привязывает данные, он не может найти свойство объекта User с именем User_Id, потому что когда SubSonic генерирует DAL, он удаляет подчеркивание из имени свойства. Лучшее исправление (как указал Раноморе):

ddlUsers.DataValueField = User.UserIdColumn.PropertyName;  
1 голос
/ 15 мая 2009

В SubSonic 2.2 вы также можете сделать это:

ddlUsers.DataValueField = User.UserIdColumn.PropertyName;

Таким образом, вы можете избежать жесткого кодирования имен столбцов в вашем коде.

...