4

次のDBスキーマを使用します。

CREATE TABLE master (
    id integer primary key autoincrement, 
    title text);
CREATE TABLE slave (
    id integer primary key autoincrement, 
    master_id integer not null, 
    title text, 
    foreign key (master_id) references master (id));

sqliteデータベースを作成し、それを使用してEntityFramework.edmxファイルを作成しました。

次に、マスターレコードとスレーブレコードを追加します。これは正常に機能し、スレーブレコードを削除しようとしますが、例外が発生し、理由がわかりません。

var ctx = new blaEntities();
var newMaster = master.Createmaster(0);
ctx.masters.AddObject(newMaster);

var newSlave = slave.Createslave(0, 0);
newMaster.slaves.Add(newSlave);

ctx.SaveChanges(); // works fine, both id and master_id properties of newMaster 
                   // and newSlave are then set with generated values.

newMaster.slaves.Remove(newSlave);

ctx.SaveChanges(); // InvalidOperationException is raised

例外のメッセージは次のとおりです。

操作が失敗しました:1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。リレーションシップに変更が加えられると、関連する外部キープロパティがnull値に設定されます。外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、関連のないオブジェクトを削除する必要があります。

私は何が間違っているのですか?

編集

EFCreateslave(...)メソッドによって生成されたものは次のとおりです。

public static slave Createslave(global::System.Int64 id, global::System.Int64 master_id)
{
    slave slave = new slave();
    slave.id = id;
    slave.master_id = master_id;
    return slave;
}
4

2 に答える 2

1

スレーブ テーブルには、masterId 列に値が設定されていないスレーブ オブジェクトが残っています。

を使っctx.DeleteObject(newSlave)て解消してみてください。

于 2012-07-03T11:00:18.387 に答える
1

あなたのスレーブはまだ存在しており、彼の FK 列 master_id には値が必要です。完全に削除する場合は、親から削除するのではなく、削除するように EF に指示する必要があります。削除したくない場合は、新しい master_id を割り当てるか、この列を null 許容として設定してください。

于 2012-07-03T11:00:06.483 に答える