2012-05-30 2 views
0

В моей базе данных у меня есть таблица, как этотУникальное ограничение на Nullable в 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» ограничен уникальным. Значение '' уже присутствует.

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

+0

В отличие от форумов, мы не используем «Спасибо», или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

ответ

1

Вам нужно сказать DataTable значения нулевого принимаются.

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

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

Edit 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 

Edit 2

Th не работает:/

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); 
+0

Нет, значение по умолчанию истинно (см. вашу собственную ссылку) –

+0

Это глупо, кажется, нет способа сделать это Oo –

+0

Согласитесь, что это глупо :) –

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