Tak naprawdę rozłączenie z bazą nie powoduje fizycznego rozłączenia. Połączenie i tak jest trzymane cały czas, a gdy program zażąda połączenia ponownie, jest używane to już zestawione. Tak przynajmniej działało to z mysql i mysql connectorem, specjanie sprawdzałem czy na pewno tak jest.
Więc równie dobrze mozna dać wszystko pod using i łączyć się z bazą za każdym razem, na wydajność to znacząco wpłynąć nie powinno.
Co do ORM - no bardzo fajne, ułatwia ale przejrzystość bardziej skomplikowanych zapytań... dla początkujących może to wyglądać nieco "dziwnie", np:
ctx.MiejscaPrzechowywania
.SelectMany(d => ctx.Materialy, (a, b) => new { a, b })
.Where(x => x.b.MA_ID == x.a.MA_ID)
.SelectMany(y => ctx.Osoby, (g, h) => new { g, h })
.Where(y => y.h.OS_ID == y.g.a.MP_FK_OS_ID_KOMU_WYDANO)
.Select(x => new
{
x.g.b.KT_ETYKIETA,
x.g.a.MA_LP,
x.g.b.MA_DATA_REJESTRACJI,
x.g.b.MA_INF_O_ZMIANIE_KLAUZULI,
x.g.a.MP_NR_RTD_TECZKI,
x.h.OS_ETYKIETA,
x.g.a.MP_FK_KO_ID_WLASCICIEL_MP,
x.g.a.JR_NAZWA
}).ToList();
Chociaż, bardziej "normalnie też można:
(from a in ctx.MiejscaPrzechowywania
from b in ctx.Materialy
where b.MA_ID == a.MA_ID
from h in ctx.Osoby
where h.OS_ID == a.MP_FK_OS_ID_KOMU_WYDANO
select new
{
KT_ETYKIETA = b.KT_ETYKIETA,
MA_LP = a.MA_LP,
MA_DATA_REJESTRACJI = b.MA_DATA_REJESTRACJI,
MA_INF_O_ZMIANIE_KLAUZULI = b.MA_INF_O_ZMIANIE_KLAUZULI,
MP_NR_RTD_TECZKI = a.MP_NR_RTD_TECZKI,
OS_ETYKIETA = h.OS_ETYKIETA,
MP_FK_KO_ID_WLASCICIEL_MP = a.MP_FK_KO_ID_WLASCICIEL_MP,
JR_NAZWA = a.JR_NAZWA
}).ToList();