PDA

Prikaži potpunu verziju : Entity Framework 5.0 CodeFirst binding master-details winform


krahi
28.10.2012, 13:01
Dole pomenuti kod je u stanju da u details tabeli(datagridview2) updateuje podatke,dodaje i brise.Medjutim problem je sto u master tabeli moze samo da updateuje postojece podatke tj. nije u mogucnosti da ih dodaje ili brise.
Posle dodavanja u master tabelu,novododani podaci se vide u datagidu1 i u memoriji,ali posle SaveChanges() metoda oni ne budu snimljeni u bazu.


BindingSource bsAvioni, bsPutnici;
NovaBaza baza = new NovaBaza();
private void Form1_Load(object sender, EventArgs e)
{
bsAvioni = new BindingSource();
bsPutnici = new BindingSource();
bsAvioni.DataSource = (from n in baza.Avioni.Include("Putnici")
select n).ToList<Avion>();
dataGridView1.DataSource = bsAvioni;
bsPutnici.DataSource = bsAvioni;
bsPutnici.DataMember = "putnici";
dataGridView2.DataSource = bsPutnici;
}


Kod database first pristupa,koristeci ObjectContext template taj problem se resavao sledecim kodom

bsAvioni.DataSource = (from n in baza.Avioni.Include("Putnici")
select n);

Dakle,bindovanjem direktno na linq query,posle cega sam bio u mogucnosti da brise i dodajem u master tabelu.Prilicno sam siguran da je tu problem i sada,samo sto se u EF5 ne moze direktno bindovati na query.

Ovo su moje klase

public class Avion
{
public Avion()
{
putnici = new List<Putnik>();
}
public int id { get; set; }
public string tip { get; set; }
public List<Putnik> putnici { get; set; }
}
public class Putnik
{
public int id { get; set; }
public string ime { get; set; }
public string prezime { get; set; }
public virtual Avion avion { get; set; }
}


public class NovaBaza:DbContext
{
public DbSet<Avion> Avioni { get; set; }
public DbSet<Putnik> Putnici { get; set; }
}

Todors
29.10.2012, 13:36
Gde ti uopšte ovde koristiš EF u ovom kodu? Mislim nigde, al nema veze.

Na EF ne možeš dirketno da binduješ na query iz prostog razloga što to njegov posao, a ti bi mu na taj način dao već gotove podatke za grid. Mogao bih jedino u slučaju da šalješ podatke u suprotnom smeru (tj. ka bazi). Ovako ne.

Ako hoćeš da binduješ na objekte možeš da koristiš dataSource i on fino radi sa EF ili da imaš neku čvrstu bazu bilo kakvog porekla.

Sturmbannfuhrer
29.10.2012, 14:21
@Todors

A sta se to gore koristi,ako nije problem da mi objasnis?

Todors
29.10.2012, 15:27
Nisam bukvalno mislio da se uopšte ne koristi već pogrešno, a to mu opet dođe na isto.

Trebalo da binduje dataSource na DataSet ili neki drugi izvor i da koristi EF za GRUD operacije.

Znači problem je u implementaciji.

Todors
29.10.2012, 15:49
Evo nešto sam pronašao na netu, možda ti pomogne.


http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/448f1210-8785-44fa-8aa2-4f71dfd42330

Da ne bude nesporazuma.

Želim da pomognem, ali sad za to nemam vremena. Možda neko može bolje da objasni.

Sturmbannfuhrer
29.10.2012, 16:51
Kakav crni DataSet...

Primer iz prvog posta je skolski i kolko ja vidim,takav pristup se i preporucuje tj. .ToList()

Insert i delete podatka iz bindingsourca u context mora da se radi uz pomoc stapa i kanapa.tj rutina se pise rucno.

Evo covek je ovde to obrazlozio...
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/657f80c4-a6e3-4b15-a9da-ea8bcfe9a867

Uz sve iteracije EF broj novih stvari se povecava rapidno,a da stvar bude komlikovanija,podrska za stare se brise.Tako da neko ko je koristio ef 4 i presao na 5 moze da ocekuje pakao.