Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
.NET 4.x

Маппинг enum в string (EntityFramework) или свой строковый тип

08.10.2015, 16:00. Показов 2236. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые, требуется совет. Есть сущность:
C#
1
2
3
4
    public class Entity
    {
        public Guid Id { get; set; }
    }
К этой сущности надо еще добавить поле "Тип", например:
C#
1
2
3
4
5
6
7
8
9
10
    public enum EntityType
    {
        TypeOne,
        TypeTwo
    }
    public class Entity
    {
        public Guid Id { get; set; }
        public EntityType Type { get; set; }
    }
В дальнейшем к типу EntityType нужно будет добавить методы расширения (IsOk...).

При этом хочется что бы в БД в атрибуте Type было не интовое значение а строковое. Как можно сделать маппинг в EntityFramework 6, что бы Type как enum, можно было использовать в Linq to Sql запросах ?
Как вариант думал отнаследоваться от string и сделать класс со статичными полями этого типа. Тогда в БД были бы строковые значения, и экстеншены распространялись только на мой тип а не на все строки, но от стринга нельзя наследоваться. Подскажите что делать ? как решают такую проблему ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2015, 16:00
Ответы с готовыми решениями:

Добавить свой тип (Enum) в тип переменной My.Settings
Доброй ночи! В принципе название темы говорит само за себя. Нужен параметр приложения с моим типом данных. В данном случае это enum. Но...

Строковый тип. Описать функцию splite(name:string:var first,last:string)
Написать функцию splite(name:string:var first,last:string), которая из параметра name, хранящего имя и фамилию человека, извлекает их в...

с++ строковый тип (string)
ввести строку,содержащую число в троичной системе исчесления и напечатать его в 10 системе или -1 если это невозможно

12
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 16:39
А чем вас не устраивает хранить целые числа в БД? Просто написать хелпер, который будет коневертировать enum в int и обратно.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
08.10.2015, 16:50  [ТС]
Цитата Сообщение от KrekerOK Посмотреть сообщение
А чем вас не устраивает хранить целые числа в БД?
Не информативно.
Стоит задача хранить строковое представление значения в базе а в программе строго типизированное значение.
0
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 16:55
Ну а если просто записывать в БД значение enum в строковом представлении (TypeOne.ToString()). Если надо обратно получить enum, то воспользоваться Enum.Parse(). Или я не до конца понял задание?
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
08.10.2015, 16:58  [ТС]
KrekerOK, я не совсем понял о чем вы. Если у нас значение типа enum от в БД запишется интовое значение:
C#
1
2
3
4
5
6
7
8
9
10
            using (var ctx = new MyContext())
            {
                var e = new Entity
                {
                    Id = Guid.NewGuid(),
                    Type = EntityType.TypeOne
                };
                ctx.Entitys.Add(e);
                ctx.SaveChanges();
            }
В БД будет примерно так:
Id Type
какой-то Guid, 0
А надо что бы было так:
Id Type
какой-то Guid, TypeOne
При этом данные сущности в программе должны быть как-то типизированы для возможности добавления методов расширения.
0
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 17:03
В БД это поле сделайте типа строки, а записывайте так:
C#
1
Type = EntityType.TypeOne.ToString();
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
08.10.2015, 17:06  [ТС]
KrekerOK, Type тогда каким типом должен быть ?
0
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 17:15
В базе данных строковым (nvarchar(50) к примеру). В самой программе Enum.
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
08.10.2015, 17:19  [ТС]
KrekerOK, что-то я не пойму, в программе вы говорите что будет enum:
Цитата Сообщение от KrekerOK Посмотреть сообщение
В самой программе Enum.
а сами делаете приведение к строке:
Цитата Сообщение от KrekerOK Посмотреть сообщение
В БД это поле сделайте типа строки, а записывайте так:
Type = EntityType.TypeOne.ToString();
Как так ?
Можно пример тогда создания, записи сущности в базу и ее выбанчивание обратно, что бы понятней стало.
0
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 17:30
Вот ваше перечисление:
C#
1
2
3
4
5
public enum EntityType
{
    TypeOne,
    TypeTwo
}
Вот так мы запишем в БД объект, у которого поле Type будет равно "TypeOn" (получается информативно)
C#
1
2
3
4
5
6
7
8
9
10
using (var ctx = new MyContext())
{
    var e = new Entity
    {
        Id = Guid.NewGuid(),
        Type = EntityType.TypeOne.ToString()
    };
    ctx.Entitys.Add(e);
    ctx.SaveChanges();
}
Далее, получим все объекты у которых Type равно TypeOn:
C#
1
2
3
4
5
var requiredObjectType = EntityType.TypeOne.ToString();
using (var ctx = new MyContext())
{
    var rowsWithTypeOn = ctx.Entitys.Where(ent=>ent.Type == requiredObjectType).ToList();
}
Если надо превратить значение из БД в enum (ну например в свиче использовать или что то типа этого), то делаем так:
C#
1
var stringToEnum = (EntityType)Enum.Parse(typeof(EntityType), "TypeOne");
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
08.10.2015, 17:48  [ТС]
KrekerOK,
1) это не удобно, т.к. придется каждый раз преобразовывать enum в string в коде
2) не получить добавить методы расширения для моего типа, точнее добавить получится, но воспользоваться ими нет, так как Type в Entity есть string а не EntityType.
Хочется более элегантного решения)
0
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
08.10.2015, 18:44
Попробуйте атрибут DataType использовать на свойстве, хотя вряд ли поможет
1
 Аватар для KrekerOK
57 / 57 / 20
Регистрация: 04.07.2013
Сообщений: 524
08.10.2015, 20:25
Ну тогда удачи вам. Я тоже люблю элегантность в коде. Недавно я хотел найти способ перегрузить explicit operator для enum, но поняв глупость затее - прекратил поиски.
Вам скорее всего это будет трудно сделать, т. к. по своей сути enum это набор строк, каждой из которых соответсвует целое число.
Да, кстати, а почему бы вам не создать отдельную таблицу для в БД, хотя это уже будет без enum.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2015, 20:25
Помогаю со студенческими работами здесь

Строковый тип данных - string! TP
Ввести фамилию, имя и отчество как одно данное типа рядок. Определить длинну рядка и количество в нем букв "А". +...

Напишите программу с реализацией стека, где его элементы будут иметь строковый тип – string
Здравствуйте! Помогите, пожалуйста, написать программу с реализацией стека, где его элементы будут иметь строковый тип – string. За основу...

Как перевести свой тип данных в string?
у меня есть тип данных "TState = (Play, Pause, Stop);" Как перевести его в тип данных string?

Проверка на строковый или символьный тип данных
У меня есть небольшая программка, которая суммирует первые три числа после запятой у дроби: #include <iostream.h> #include...

Есть ли оператор, который переводит строковый тип в Integer или Real
Напомните мне пожалуйста как называется оператор, который переводит строковый тип в интегер или реал Друзья сказали strinint или string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru