1

私のデータベースには、このようなテーブルがあります

table foo
int pk
int someFK NULL

someFK の外部キー制約と someFK の一意の制約。これは、MySQL データベースでは、someFK で NULL を指定しない限り、もちろん対応するテーブルに行が存在する必要があることを意味します。ただし、一意の制約がオンになっている場合でも、someFK に NULL を含む複数の行を含めることもできます。

私のコードでは、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;

ただし、DataTable に 2 つの DataRow を追加し、これら 2 つの主キーが異なり、どちらも someFK 列に DBNull がある場合、エラー メッセージ Exception Type: System.Data.ConstraintException Exception Message: Column 'somefk' is constrainted to一意であること。値 '' は既に存在します。

これは私が期待するものではないので、誰かがこれを回避する方法を知っているかどうか疑問に思っていました(一意のプロパティを削除せずに)

4

1 に答える 1

1

DataTable の null 値が受け入れられることを伝える必要があります。

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

詳細はこちら

編集 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);
于 2012-05-30T12:00:00.077 に答える