Уникальное ограничение на значение NULL в System.Data.DataColumn

В моей базе данных есть такая таблица

table foo
int pk
int someFK NULL

с ограничением внешнего ключа на someFK и ограничением уникальности на someFK. Это означает, что в базе данных MySQL, которая у меня есть, если я не укажу NULL в someFK, конечно, должна быть строка в соответствующей таблице. Однако у меня также может быть несколько строк с NULL в someFK, даже если включено ограничение уникальности.

В моем коде я использую пространство имен System.Data и делаю так:

DataTable table = new DataTable("Foo");

DataColumn col = null;

DataColumn[] primaryKey = new DataColumn[1];

col = table.Columns.Add(FooPropertyName, typeof(int));
col.Unique = true;
col.AutoIncrement = true;
primaryKey[0] = col;
table.PrimaryKey = primaryKey;

col = table.Columns.Add(SomeFkPropertyName, typeof(int));
col.Unique = true;
col.AutoIncrement = false;

Однако, если я добавлю два DataRows в свой DataTable, и эти два имеют разные первичные ключи, но оба имеют DBNull в столбце someFK, я получаю сообщение об ошибке Тип исключения: System.Data.ConstraintException Сообщение об исключении: столбец 'somefk' ограничен быть уникальным. Значение '' уже присутствует.

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


person El Che    schedule 30.05.2012    source источник
comment
В отличие от форумов, мы не используем слова «Спасибо» или «Любая помощь приветствуется» или подписи на Stack Overflow. См. раздел Должен ли быть "Привет", "спасибо" слоганов и приветствий удалить из постов?.   -  person John Saunders    schedule 08.10.2012


Ответы (1)


Вам нужно сообщить, что пустые значения DataTable принимаются.

col = table.Columns.Add(SomeFkPropertyName, typeof(int)); 
col.Unique = true; 
col.AutoIncrement = false; 
col.AllowDBNull = true;

Подробнее здесь AllowDBNull

Изменить 1

Ты прав, все еще сломан,

        var table = new DataTable("Foo");
        table.Columns.AddRange(new []
        {
            new DataColumn("FooPropertyName", typeof(int))
            {
                Unique = true,
                AutoIncrement = true
            },
            new DataColumn("SomeFkPropertyName")
            {
                Unique = true,
                AllowDBNull = true
            },
        });
        table.PrimaryKey = new[] {table.Columns[0]};

        table.Rows.Add(0, 0);
        table.Rows.Add(1, 1);
        table.Rows.Add(2, DBNull.Value);
        table.Rows.Add(3, DBNull.Value); // Exception here

Изменить 2

Это тоже не сработало :/

private class MyDbNull
{
    public static MyDbNull Value = new MyDbNull();
    public override bool Equals(object obj)
    {
        return false;
    }

    public override int GetHashCode()
    {
        return 0;
    }
}

table.Rows.Add(2, MyDbNull.Value);
table.Rows.Add(3, MyDbNull.Value);
person M Afifi    schedule 30.05.2012
comment
Нет, значение по умолчанию верно (см. собственную ссылку) - person El Che; 30.05.2012
comment
Глядя на ваши изменения: в любом случае в классах, похоже, отсутствует какое-то понятие уникальности в столбцах внешнего ключа (моделирование отношений (0-1)-(1) - person El Che; 30.05.2012
comment
Я отмечу ваш ответ как принятый, поскольку я думаю, что мы согласны с тем, что это не работает так, как, на мой взгляд, должно. Несчастный. - person El Che; 30.05.2012