Sveiki, kaip žinia LINQ to SQL panaudojimas taip vadinamoje "disconnected" aplinkoje nėra labai patogus. Iki šiol teko matyti / daryti keliais būdais, todėl būtų įdomu sužinoti kaip šią problemą sprendžiate jus.
Mes kaip ir nieko labai sudėtingo nedarom:
- turim bazinę entity klasę, kuri iš esmės papildyta properčiu IsNew(naudojamas nustatymui, ar reikia atachinti ar insertinti) ir metodu Detach
- turim faktorių, kad valdyti datacontexto instance'ų kūrimą
- turim šiek tiek helperių batch updeitams/sortinimui/triminimui
- šiek tiek konfliktų resolvinimo logikos datacontext'e
O visa kita daroma rankutėmis.
Bet jeigu kažkas darė kažką daugiau, būtų įdomu pamatyti.
O kaip darai su vaikiniais įrašais, kada jie detachint'i yra trinami / pridedami?
BTW., kaip atrodo Detach metodas?
Detach atrodo taip (nors dabar pažiūrėjau kodą, niekam to metodo taip ir neprireikė):
public void Detach() { GetType().GetMethod("Initialize", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this, null); }
Kas dėl trynimo, tai mes ėjom gal ne pačiu patogiausiu vartotojui keliu, bet paprasčiausiu programuotojui - visur trinam iškart po confirmation'o patvirtinimo, t.y. nelaukdami kol tėvinis objektas bus saugomas.
Nežinau link kur eina EF4.0 spręsdamas šitas problemas, bet jeigu reikėtų, aš gal galvočiau taip: daryčiau požymį IsDeleted EntityBase klasėje, tada pagal tą požymį galiama konstruoti trynimo logiką.
Kas liečia vaikinių įrašų trinimo, tai egzistuoja projektas: http://linq2sqleb.codeplex.com/, kuris aprašo LINQ to SQL Entity Base objektą su būsena. Tai vat jo pagalba dar šiek tiek uždavinys palengvėja.
Kas liečia EF4, tai ten jau atsirado self-tracking objects būtent tokiems scenarijams, tai bus daug geriau. Taip pat MS žadėjo vėliau pridėti self-tracking POCO, vat čia bus visai jėga.