Linq2Sqlで1対多の関係を保存する最良の方法は何ですか?
-
10-07-2019 - |
質問
Linq2Sqlで単純な1対多の関係を保存する最良の方法を見つけようとしています。
次のPOCOモデル(pseduoコードbtw)があると仮定します。
個人には0〜多数の車両があります。
class Person
{
IList<Vehicle> Vehicle;
}
class Vehicle
{
string Name;
string Colour;
}
今、Personを保存すると、そのpocoオブジェクトをリポジトリコード(たまたまL2S)に渡します。人物オブジェクトを保存できます。私は通常これを行います。
using (Db db = new Db())
{
var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person();
// Left to right stuff.
newPerson.Name = person.Name;
newPerson.Age = person.Age;
if (newPerson.Id <= 0)
db.People.InsertOnSubmit(newPerson);
db.SubmitChanges();
}
私はその人が持っているかもしれない車両のリストをどこでどのように扱うべきかわからないのですか?提案はありますか?
解決
using (Db db = new Db())
{
var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person();
// Left to right stuff.
newPerson.Name = person.Name;
newPerson.Age = person.Age;
// add vehicles.
Vehicle firstV = new Vehicle();
firstV.Name = "some name";
firstV.Person = newPerson; // need to do this to set the person Id on the vehicle.
newPerson.Vehicle.Add(firstV);
// now when you save the Person it should save the Vehicle list
// if you set Cascade save update on the list. (not sure how to do that in L2S
if (newPerson.Id <= 0)
db.People.InsertOnSubmit(newPerson);
db.SubmitChanges();
}
ここで、インターフェースからのデータを使用して、別のレベルで車両のリストを作成することを選択できます。
ただし、PersonオブジェクトのリストにVehicleを追加するだけでは十分でないことを覚えておく必要があります。また、vehicles Personプロパティを、乗り物を持つ人に設定する必要があります。
観察これについてはわかりませんが、 db.People.SingleOrDefault を実行すると、メモリ内のPeopleテーブル全体が読み込まれる可能性があります。それはあなたがしたいことではありません。コメントのSlaceによって修正されました。
他のヒント
必要なことは、データベース内に適切な関係が設定されていることを確認することだけです。
VehicleテーブルにPersonIdがあり、それらをDBML Linq to SQLに追加するときに外部キーがある場合、それらの間に関係があることを検出し、関係のTable<T>
表現を作成します。
所属していません StackOverflow