[ corelko @ 08.02.2017. 10:04 ] @
Treba mi mala pomoc za jedan LINQ upit nad vezom many to many.
Koristim EntityFramework database first koncept.
Naime radim sa 3 tabele, evo konkretnog primera tabela i nekih od njihovih property-ja

CAR
idCar(PK)
name
registernumber

WORKUNIT
idWorkUnit(PK)
name
contact

CARWORKUNIT
idCar(FK)
idWorkUnit(FK)
active

Npr, treba mi LINQ upit koji ce mi vratiti listu name iz CAR, name iz WORKUNIT gdje je active iz CARWORKUNIT na TRUE.
Treca tabela mi sluzi da pamtim koji CAR se trenutno nalazi u kojoj WORKUNIT.
U SQL ovo znam da napisem ali mi za LINQ ne ide.

Hvala unapred
[ Shadowed @ 08.02.2017. 10:21 ] @
Pod pretpostavkom da su navigation properties napravljeni kako treba:

Context.CarWorkunits.Where(cw => cw.active).Select(cw => new { cw.Car.name, cw.Workunit.name });


Inace, ako ti se Car nalazi samo u jednom Workunit, postavka ti je pogresna. Sa trecom tabelom pravis many-to-many relaciju. Ako je Car u samo jednom Workunit-u, medjutabela ti ne treba a treba ti WorkunitID u tabeli Car.
[ corelko @ 08.02.2017. 10:26 ] @
Nije CAR u samo jednom WORKUNIT.
Trenutno se moze nalaziti samo u jednom WORKUNIT i zato imam property active, ali nekad kasnije moze da predje u drugi WORKUNIT a meni treba informacija o prethodnim stanjima tj kuda se on "setao" po WROKUNIT. Valjda sam bio jasan.

Ovaj upit mi vrati gresku:

Code:
Error    CS0833    An anonymous type cannot have multiple properties with the same name

gde me pozicionira na cw.Workunit.name

Hvala puno

[Ovu poruku je menjao corelko dana 08.02.2017. u 11:42 GMT+1]

[Ovu poruku je menjao corelko dana 08.02.2017. u 11:43 GMT+1]
[ Shadowed @ 08.02.2017. 10:36 ] @
OK, u tom slucaju bi ono sto sam ti dao trebalo da ti zavrsava pos'o.
[ mmix @ 08.02.2017. 11:07 ] @
Fali ti jos polja za to sto ti hoces. Ako u svakom trenutku samo jedan car moze da bude aktivan u samo jednom unitu onda radis to sto ti je rekao Shadowed i pored toga napravis tabelu carworkhistory u koju ces da ubacis entry svaki put kad kola udji/izadju ili oba iz workitema po potrebi.

[ corelko @ 08.02.2017. 11:27 ] @
Evo i sta mi konkretno treba.
Sad imam ovu situaciju o kojoj Shadowed prica.
Imam vozila i radne jedinice. Svako vozilo pravi neke troskove u svojoj radnoj jedinici.
Medjutim kada vozilo predje u neku drugu radnu jedinicu, po postojecem stanju, presli bi i troskovi u tu radnu jedinicu
i ja bih izgubio podatke o troskovima koje je vozilo napravilo u prethodnoj radnoj jedinici. To je jasno.
Ovako izgleda moja postavka baze, trenutno:

[Car]
idCar (PK)
idWorkUnit (FK)
name
.....



[WorkUnit]
idWorkUnit(PK)
name
contact
.....

Valjda sa tabelom [CarWorkUnit] koju sam napravio i vezom many to many mogu da obezbedim "setanje" vozila iz radne jedinice u jedinicu,
da pamtim gde je vozilo bilo sve do sada po radnim jedinicama i pomocu property active da znam gde se trenutno nalazi.

Mozda gresim. Ovo sto si napisao da u jednom trenutku, jedno vozilo moze da bude samo u jednom unitu je tacno. Dakle ne moze nikako istovremeno biti u 2 unita.
Najveci nedostatak ovog mog postojeceg stanja je sto mi se gubi "istorija" troskova koje je vozilo pravilo u prethodnim unitima a to mi je jako bitno.
[ mmix @ 08.02.2017. 12:00 ] @
Onda samo prosiris ovo sto sam ti rekao i umesto istorije imas troskove. Dakle


[Car]
idCar (PK)
idWorkUnit (FK)
name
.....


[WorkUnit]
idWorkUnit(PK)
name
contact
.....


[CarWorkCost]
idCarWorkCost (PK)
idCar (FK)
idWorkUnit (FK)
amount
date
driver
....

Za svako vozilo znas gde je (ako stavis FK na notnull u Car onda svako vozila i mora da negde bude aktivno), za svaku jedinicu znas pridruzena vozila, za svaku jedinicu i za svako vozilo (zajedno ili zasebno), znas troskove I mozes da radis agregaciju i imas kompletnu istoriju svih troskova.

Uvek gledaj da ti baza zadovoljava 3NF (google it ako ne znas sta je), tvoja sema efektivno krsi 3NF jer mozes imati isti auto aktivan u dve jedinice.
[ corelko @ 08.02.2017. 13:17 ] @
Kako mogu imati aktivno vozilo u 2 jedinice?

Po cemu se razlikuje moja tabela od tvoje koja proizilazi od osobine veze many to meny?
Ja sam zaista zaboravio da stavim neki id tamo kao PK.
Zato sam dodao polje jos jedno polje active koje moze imati vrednosti 0 ili 1 u zavisnosti gde se vozilo nalazi.


[ mmix @ 08.02.2017. 16:16 ] @
Mozes imati tako sto imas dva reda sa istim kolima i jedinicom u kojima je active=1. Ti to mozda kontrolises kroz aplikativni sloj ali je generalno bad DB design jer jedna SQL komanda moze da je dovede u neispravno stanje, cak i kao rezultat bug-a u tvom aplikativnom nivou.

Moj i tvoj dizajn se razlikuje u trecoj tabeli. Ljudi olako uzimaju Many2Many da rese probleme koji se mogu resiti na laksi nacin (npr problem asocijacije kao kod tebe). M2M uopste nije lak koncept iako tako izgleda.