Передача значения перечисления как параметра хранимой процедуры (функции данных) в LINQ to SQL

Как упоминалось в этом вопросе, «LINQ to SQL позволяет сопоставлениям таблиц автоматически преобразовывать назад и вперед к Enums, указав тип столбца - это работает для строк или целых чисел ». Однако у меня возникают проблемы с этим при использовании хранимых процедур (вместо автоматически сгенерированного SQL) для создания и обновления сущностей.

В моей базе данных есть таблица Users со столбцом Role типа int. У меня также есть хранимая процедура CreateUser, которая принимает параметр @role типа int. Я хочу, чтобы роли пользователей были представлены ролью перечисления в моем коде C #. Я могу изменить тип свойства Role в автоматически созданном классе User с int на Role, но тогда проект отказывается компилироваться, потому что тип свойства Role не соответствует типу параметра роли функции данных (соответствует @ параметр роли в моей хранимой процедуре). Типы параметров функции данных автоматически генерируются LINQ to SQL, и я не могу найти способ их изменить.

Я рассматриваю возможность оставить свойство Role как int, переименовать его во что-то вроде RoleValue, сделать его частным и добавить еще одно общедоступное свойство типа Role, которое выполняет преобразование int-enum. Но похоже, что должен быть способ получше.


person Aaron    schedule 17.11.2009    source источник


Ответы (2)


Типы параметров функции данных автоматически генерируются LINQ to SQL, и я не могу найти способ их изменить.

откройте файл DBML, щелкните поле «Роль». в окне свойств будет место для указания типа сервера, а также типа .NET. вот пример того, как это работает:

Отображение перечисления из строки

ответы показывают, что он работает с VARCHAR и TINYINT, поэтому он также должен работать с INT. самая сложная часть, вероятно, не забыть поместить в правильное пространство имен. удачи!

person ifatree    schedule 03.12.2009

Вы можете перегрузить метод CreateUser ..

public Enum Role
{
    Guy = 0,
    Girl = 1
}

public partial LINQtoSQLClass
{
    public ResultObject CreateUser(Role thisRole)
    {
        return CreateUser(Convert.ToInt32(thisRole);
    }
}

Также часто используются шаблоны T4 для создания класса Enumberable с использованием данных в реальном времени из внутренней базы данных. Таким образом, он совпадает с Ints, и вам не придется обновлять его вручную.

person sidney.andrews    schedule 18.11.2009