Допустим, у вас в БД есть следующее:
table enums
-----------------
| id | name |
-----------------
| 0 | MyEnum |
| 1 | YourEnum |
-----------------
table enum_values
----------------------------------
| id | enums_id | value | key |
----------------------------------
| 0 | 0 | 0 | Apple |
| 1 | 0 | 1 | Banana |
| 2 | 0 | 2 | Pear |
| 3 | 0 | 3 | Cherry |
| 4 | 1 | 0 | Red |
| 5 | 1 | 1 | Green |
| 6 | 1 | 2 | Yellow |
----------------------------------
Создайте select, чтобы получить нужные вам значения:
select * from enums e inner join enum_values ev on ev.enums_id=e.id where e.id=0
Создайте исходный код для перечисления, и вы получите что-то вроде:
String enumSourceCode = "enum " + enumName + "{" + enumKey1 + "=" enumValue1 + "," + enumKey2 + ... + "}";
(очевидно, это построено в виде некоторого цикла.)
Затем начинается самое интересное - компиляция вашего перечисления и его использование:
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cs = new CompilerParameters();
cp.GenerateInMemory = True;
CompilerResult result = provider.CompileAssemblyFromSource(cp, enumSourceCode);
Type enumType = result.CompiledAssembly.GetType(enumName);
Теперь у вас есть тип, скомпилированный и готовый к использованию.
Чтобы получить значение перечисления, хранящееся в БД, вы можете использовать:
[Enum].Parse(enumType, value);
где значение может быть либо целым числом (0, 1 и т. д.), либо текстом / ключом перечисления (Apple, Banana и т. д.)