DLINQの使用中に興味深い問題に遭遇しました。エンティティをインスタンス化するときに、DataContextで.SubmitChanges()を呼び出すと、.Insert [All] OnSubmit(...)を呼び出さなくても、データベースに新しい行が挿入されます。
//Code sample:
Data.NetServices _netServices = new Data.NetServices(_connString);
Data.ProductOption[] test = new Data.ProductOption[]
{
new Data.ProductOption
{
Name="TEST1",
//Notice the assignment here
ProductOptionCategory=_netServices.ProductOptionCategory.First(poc => poc.Name == "laminate")
}
};
_netServices.SubmitChanges();
上記のコードを実行すると、データベースに新しい行が挿入されます。 XMLファイルを解析していくつかのテーブルにデータを入力するアプリを作成しているときに、この影響に気付きました。約50ほどしか期待していなかったときに1000以上の挿入があることに気づき、ついにこの動作を分離しました。
これらのオブジェクトが暗黙的に永続化されないようにするにはどうすればよいですか?
ありがとう、チャールズ
この関係は、2つの側面があると考えてください。リレーションシップの片側を設定する場合は、もう一方の側を更新する必要があるため、上記の場合とProductOptionCategoryを設定すると、新しいオブジェクトがラミネートProductOptionCategory側のProductOptionsリレーションシップに効果的に追加されます。
回避策はすでに発見したとおりで、代わりに基になる外部キーを設定するため、LINQ to SQLは通常の方法でオブジェクトを追跡せず、オブジェクトを永続化する必要があることを暗黙的に示す必要があります。
もちろん、パフォーマンスの最良の解決策は、追加したくないオブジェクトをソースデータから決定し、最初からインスタンスを作成しないことです。