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

Както бе споменато в този въпрос, „LINQ към SQL позволява съпоставянията на таблици да преобразуват автоматично напред и назад към Enum, като посочите типа за колоната - това работи за низове или цели числа." Имам обаче проблеми с това, когато използвам съхранени процедури (вместо автоматично генериран SQL) за създаване и актуализиране на обекти.

В моята база данни имам таблица Users с колона Role от тип int. Имам и съхранена процедура CreateUser, която приема параметър @role от тип int. Искам потребителските роли да бъдат представени от enum Роля в моя C# код. Мога да променя типа на свойството Role на автоматично генерирания потребителски клас от int на Role, но след това проектът отказва да се компилира, тъй като типът на свойството Role не съвпада с типа на параметъра на функцията за данни (съответстващ на @ ролеви параметър в моята съхранена процедура). Типовете параметри на функцията за данни се генерират автоматично от LINQ към SQL и не мога да намеря начин да ги променя.

Обмислям да оставя свойството Role като int, да го преименувам на нещо като RoleValue, да го направя частно и да добавя друго публично свойство от тип Role, което изпълнява преобразуването int-enum. Но изглежда, че трябва да има по-добър начин.


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


Отговори (2)


Типовете параметри на функцията за данни се генерират автоматично от LINQ към SQL и не мога да намеря начин да ги променя.

отворете вашия DBML файл, щракнете върху полето Роля. прозорецът със свойства ще има място за указване на типа сървър, както и типа .NET. ето пример за това как работи:

Съпоставяне на Enum от низ

отговорите показват, че работи с 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