2014-01-22 2 views
1

Как вы предлагаете принудительно применять ограничение для столбца, который отображает значения C# с флагом перечисления?Ограничение по побитовому столбцу, ведущее как C# enum flags

хорошее решение для управления битовыми операциями здесь: SQL Server Bitwise behave like C# Enum Flags

Кроме того, я хотел бы ограничить введенные значения в этом столбце. Теперь перечисление содержит около 10 членов, и оно может появиться в будущем.

ответ

0

Вместо этого я бы развернул проблему и использовал шаблоны T4 для создания класса перечисления C# из таблицы базы данных. Таким образом, он всегда синхронизирован. Это общий способ управления DB/перечислениями.

+0

Отличное решение, спасибо. Unfornatelly, мой код уже реализован, и мне нужно переместить в DB эти значения. –

+2

«мой код уже реализован» - это не всегда является достаточным условием. Иногда большее изменение теперь может сэкономить вам скорбь по трассе ... –

1

Если у вас есть побитовое перечисление с 10 номерами, то они будут иметь значения от 1 до 512, при степенях 2. Таким образом, диапазон может быть от 0 до 1023. Добавление ограничения, как это:

CREATE TABLE sample 
    (
    id  INT PRIMARY KEY, 
    flags INT, 
    CONSTRAINT chk_flgs CHECK (flags BETWEEN 0 and 1023) 
    ) 

Однако я бы настоятельно предостерег от этого. Реляционные базы данных предназначены для доступа к данным по-разному и легко выполняются запросы к данным. Побитовые операторы неэффективны в SQL. Подумайте о ситуации, когда вы хотите перечислить все соответствующие флаги? Было бы более нормализованным создание таблицы поиска с перечисляемыми значениями и добавление таблицы перекрестных ссылок между вашим источником и поисковой таблицей.

Приведенный выше пример стал бы это:

CREATE TABLE Flags 
    (
    FlagID INT PRIMARY KEY, -- When inserted, match enum value 
    FlagName nvarchar(50) 
    ); 

CREATE TABLE SampleS 
    (
    SampleID INT PRIMARY KEY 
    ); 

CREATE TABLE Xref_Sample_Flags 
    (
    SampleID INT, 
    FlagID INT, 
    CONSTRAINT FK_SampleID FOREIGN KEY (SampleID) REFERENCES Sample (SampleID), 
    CONSTRAINT FK_FlagID FOREIGN KEY (FlagID) REFERENCES Flags (FlagID) 
    ); 

Больше столов, но в долгосрочной перспективе легче поддерживать и запросы.

Смежные вопросы