Forum » Programiranje » Entity framework 6 database first
Entity framework 6 database first
detroit ::
Ali je možno zamenjat shemo (oracle ODP) v web.configu ali kjerkoli drugje? Ker se mi zapeče očitno v dll. Rabil bi pa migrirat vse skupaj na drugo shemo - pač na produkcijo od stranke.
lp
lp
Skero
sebastjan28 ::
Skoraj prepričan sem, da to ni mogoče doseči "out-of-the-box".
Fluent appi boš verjetno potreboval vsaj za nastavitev privzete sheme.
modelBuilder.HasDefaultSchema("sales");
Vseeno bi se pa tukaj jaz prvo vprašal, zakaj za razvoj uporabljate shemo, ki je drugačna od končne produkcijske. Osebno ne vidim nobene dodane vrednosti v tem,...
https://msdn.microsoft.com/en-us/librar...
Fluent appi boš verjetno potreboval vsaj za nastavitev privzete sheme.
modelBuilder.HasDefaultSchema("sales");
Vseeno bi se pa tukaj jaz prvo vprašal, zakaj za razvoj uporabljate shemo, ki je drugačna od končne produkcijske. Osebno ne vidim nobene dodane vrednosti v tem,...
https://msdn.microsoft.com/en-us/librar...
sebastjan28 ::
Hard-coded schema?
Ta podatek je iz vidika EF ekvivalenten imenom tabel. Podobno kakor imen tabel, ki so že v produkciji tudi scheme navadno nikoli več ne spreminjamo. Za takšno početje moramo imeti izredno dober razlog in to početi v zelo omejen obsegu. Tudi eden osnovnih principov EF je convention over configuration. Tudi imena tabel je EF sicer mogoče spreminjati, vendar je ta feature dodan predvsem zaradi izjem.
Na vašem mestu, bi imel s stranko dokler je še čas iskren pogovor o morebitnih glavobolih in stroških večje abstrakcije,... :)
Kakorkoli. Good luck!
Ta podatek je iz vidika EF ekvivalenten imenom tabel. Podobno kakor imen tabel, ki so že v produkciji tudi scheme navadno nikoli več ne spreminjamo. Za takšno početje moramo imeti izredno dober razlog in to početi v zelo omejen obsegu. Tudi eden osnovnih principov EF je convention over configuration. Tudi imena tabel je EF sicer mogoče spreminjati, vendar je ta feature dodan predvsem zaradi izjem.
Na vašem mestu, bi imel s stranko dokler je še čas iskren pogovor o morebitnih glavobolih in stroških večje abstrakcije,... :)
Kakorkoli. Good luck!
detroit ::
schema se zapiše v edmx (od vseh entitijev) in ko se skompila se v dll zapiše. In to je problem, ker naj tako ne bi bilo. pač zahteve:)
Skero
sebastjan28 ::
Ups.
Popolnoma sem spregledal, da uporabljate Database-first pristop. Glede na to, da se, "in memory" model gradil iz edmx datoteke, nisem prepričan, če je fluent-api sploh mogoč,..
Popolnoma sem spregledal, da uporabljate Database-first pristop. Glede na to, da se, "in memory" model gradil iz edmx datoteke, nisem prepričan, če je fluent-api sploh mogoč,..
detroit ::
http://efmodeladapter.codeplex.com/
http://chriseelmaa.com/entity-framework...
upam da bo kaj od tega delovalo:)
http://chriseelmaa.com/entity-framework...
upam da bo kaj od tega delovalo:)
Skero
detroit ::
http://stackoverflow.com/questions/2663...
drugi odgovor by jan matusek. Naredil sem create metodo, sicer sem jo moral spremeniti zaradi DefinitionQuery-jev ala view etc. Ampak ne prehudo pa seveda v edmx.cs konstruktorje popravit da so sprejemal EntityConnection. 0.5-1h dela. Super rešitev za samo shemo spremenit.
drugi odgovor by jan matusek. Naredil sem create metodo, sicer sem jo moral spremeniti zaradi DefinitionQuery-jev ala view etc. Ampak ne prehudo pa seveda v edmx.cs konstruktorje popravit da so sprejemal EntityConnection. 0.5-1h dela. Super rešitev za samo shemo spremenit.
Skero
acookook ::
Potrebujem iz več propertyjev iz tabele1, zraven pa še en property iz tabele2.
sql je tale:
Z EF core sem generiral 2 entiteti, kjer je prva
Kako z lambda expressioni izberem vse propertyje v T1 in PN v tabeli 2. Če dobro razumem, bi to že moral imeti vključeno, a mi console.log javlja, da je property T2 enak null. Probal sem s pomočjo funkcije Include, kjer pa tudi dobim error zaradi krožne reference.
sql je tale:
SELECT P.P1, P.P2, TP.PN FROM [database1].[dbo].[Table1] AS P LEFT JOIN [database1].[dbo].[Table2] AS MP ON P.LinkId = TP.Id
Z EF core sem generiral 2 entiteti, kjer je prva
public class Table1{ .... public virtual Table2 T2 {get;set;} } // in druga public class Table2{ //ostali propi public virtual ICollection<Table1> T1 {get; set;} }
Kako z lambda expressioni izberem vse propertyje v T1 in PN v tabeli 2. Če dobro razumem, bi to že moral imeti vključeno, a mi console.log javlja, da je property T2 enak null. Probal sem s pomočjo funkcije Include, kjer pa tudi dobim error zaradi krožne reference.
.
acookook ::
mislim trenutna bolj straightforward rešitev je da grem čez vse zadetke T1 in vsakemu poiščem dotičen objekt, kar je legit bi pa probal to z lambdami.
.
acookook ::
"System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.
Berem sicer, da ga lahko ignoriram, če pa se da kaj bolj proper narediti pa toliko boljše.
tudi če najprej poberem najprej vse zadeteke in potem naredim
Spomnim se, da sem nek includeProperties string nekam dodajal samo je to takrat bilo še prekompleksno za razumeti. Od takrat se pa s tem nisem več ubadal.
Berem sicer, da ga lahko ignoriram, če pa se da kaj bolj proper narediti pa toliko boljše.
tudi če najprej poberem najprej vse zadeteke in potem naredim
hits.ForEach(t1 => t1.T2 = _customLogic.GetTable2(t1.Table2Id));
Spomnim se, da sem nek includeProperties string nekam dodajal samo je to takrat bilo še prekompleksno za razumeti. Od takrat se pa s tem nisem več ubadal.
.
Zgodovina sprememb…
- spremenil: acookook ()
darkolord ::
Ja bolj proper je da narediš nov model in zmapiraš podatke, potem pa vrneš tega, namesto da vračaš direkt model iz baze.
Zgodovina sprememb…
- spremenilo: darkolord ()
acookook ::
če probam nafilati v dto (preko konstruktorja), mi prav tako javi to napako. Bom izklopil, kar me sicer zelo moti.
.
acookook ::
hits.ForEach(h => hitDto.Add(new hitDTO(h, _customLogic.GetT2(h.t2))));
v IActionResult controllerju potem vrnem:
return new OkObjectResult(new { statusCode = HttpStatusCode.OK, hits = Json(hitsDTO) })
Moral bi si progledati AutoMapper oz. pravilno skonfigurirati EF Core Power Tools. Pač moti me to, da je že v osnovi tale proterty "Table2" že v JS vrne null.
.
acookook ::
Include bi moral biti OK. Kakšen error točno dobiš?
Se pravi najbolj enostavno kar se da? Tu pol ne dobim errorja.
return _context.Table1.Include(p => p.Table2).ToList();
Da še malo na glas razmislim, v tabeli1 so vsi podatki, kjer foreign key kaže na določeno skupino podatkov. Pozabil sem sicer omeniti, da se poslužujem EF core power tools extensiona, torej database-first pristop.
.
Zgodovina sprememb…
- spremenil: acookook ()
FireSnake ::
Nekje moraš imeti tudi nastavljene povezave med tabelami, to ti fali.
Tako, kot si zgoraj navedel potem uporabiš.
Ampak: brez tolist(), če se pravilno spominjam.
Jaz sem zadnji dve leti (ko sem še programiral) v javi delal zato, žal, ne vem natančno kje moraš to nastaviti.
V glavnem: ne samo razrede za mapiranje, tudi relacije (joine) med tabelami moraš imeti nastavljene.
In tole:
https://slo-tech.com/forum/t689898/p781...
je prava pot.
In pri mapiranju "na roko" nastaviš iz katere tabele je kateri podatek.
Tako, kot si zgoraj navedel potem uporabiš.
Ampak: brez tolist(), če se pravilno spominjam.
Jaz sem zadnji dve leti (ko sem še programiral) v javi delal zato, žal, ne vem natančno kje moraš to nastaviti.
V glavnem: ne samo razrede za mapiranje, tudi relacije (joine) med tabelami moraš imeti nastavljene.
In tole:
https://slo-tech.com/forum/t689898/p781...
je prava pot.
In pri mapiranju "na roko" nastaviš iz katere tabele je kateri podatek.
Poglej in se nasmej: vicmaher.si
Zgodovina sprememb…
- spremenilo: FireSnake ()
acookook ::
evo, mi je uspelo.
Sem res moral uporabiti DTO, lambda pa je potem bila naslednja:
Modele iz baze (in context) sicer generiram s pomočjo extensiona EF Core Power tools. Sem naprej mislil, da je kaka hiba tam.
p.s. Inlcude uporabljata dve knjižnica. Po defaultu VS importa napačno, tako da sem še moral vključiti pravo
Sem res moral uporabiti DTO, lambda pa je potem bila naslednja:
return _context.Tabela1.Include(t => t.Tabela2) .Select(p => new Tabela1DTO { Id = p.Id, Note = p.Note, //Property 3, 4, 5...... ProductGroup = p.Tabela2.ProductGroup //Ta vrstica je važna. }).ToList();
Modele iz baze (in context) sicer generiram s pomočjo extensiona EF Core Power tools. Sem naprej mislil, da je kaka hiba tam.
p.s. Inlcude uporabljata dve knjižnica. Po defaultu VS importa napačno, tako da sem še moral vključiti pravo
using Microsoft.EntityFrameworkCore;
.
FireSnake ::
No, tako pa bo :)
Nov DTO in "na roko" pofilat propertye.
Tole zna še komu drugemu prav priti, ker se hitro pojavi scenarij, ko avtomatično mapiranje zataji in je treba zadevo urediti.
Pa tu se šele zabava začne, ker property je tukaj lahko tudi seznam.
Kar stoži se mi, ko se spominjam koloko tega smo "preklofali".
Nov DTO in "na roko" pofilat propertye.
Tole zna še komu drugemu prav priti, ker se hitro pojavi scenarij, ko avtomatično mapiranje zataji in je treba zadevo urediti.
Pa tu se šele zabava začne, ker property je tukaj lahko tudi seznam.
Kar stoži se mi, ko se spominjam koloko tega smo "preklofali".
Poglej in se nasmej: vicmaher.si
acookook ::
Bom še moral malo to povaditi z ".Where(t1 => t1.ProductCount >0)" stavkom, ker mi meče
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid... for more information.čeprav imam ToList() na koncu.
.
luli ::
Pomeni, da Linq ne zna narediti SQL stavka, ter da pred where klici tolist, da bo Linq nato naredil poizvedbo nad strukturo v pomnilniku.
darkolord ::
Če hočeš poizvedbo narest na bazi sami, potem to ni dobro, ker ti bo stankal dol podatke (včasih tudi celo tabelo ali več njih) in jih pofiltriral lokalno
Zgodovina sprememb…
- spremenilo: darkolord ()
darkolord ::
Ne ne, samo query popravi.
Tista napaka večinoma ne pomeni, da "ne zna", ampak da ne more - npr. če poskusiš v queryu kombinirati lokalne in oddaljene podatke, ali če uporabljaš lokalne funkcije ali custom funkcije na bazi ipd.
Tista napaka večinoma ne pomeni, da "ne zna", ampak da ne more - npr. če poskusiš v queryu kombinirati lokalne in oddaljene podatke, ali če uporabljaš lokalne funkcije ali custom funkcije na bazi ipd.
acookook ::
Se pravi, where dam za include in pred select?
Je kakšen tutorial za tele lambde, da se jih potem bolj z verziram? Nekje sem videl tudi nek include properties. Na kar sem pomislil še pred .Include()?
Je kakšen tutorial za tele lambde, da se jih potem bolj z verziram? Nekje sem videl tudi nek include properties. Na kar sem pomislil še pred .Include()?
.
acookook ::
oz. nekaj takega
in potem
var result1 = _ctx.Tabela1.Include(...).Where()....
in potem
return result.select().orderbydescending()....toList()?
.
Zgodovina sprememb…
- spremenil: acookook ()
luli ::
Include naloži drugo entiteto. V kolikor uporabljaš EF core lahko pogledaš generiran SQL. Ampak ti tabeli morata biti povezani.
Lahko preko atributov v modelu, ampak sam raje uporabljam onmodemcreating event na dbcontextu.
Mora pa biti stavek tipa
Lahko pa greš tudi v kontra smeri.
Ko in šele ko obstaja relacijskaPovezava lahko uporabljaš Include. Če tega nimaš je Join najboljši približek.
Lahko preko atributov v modelu, ampak sam raje uporabljam onmodemcreating event na dbcontextu.
Mora pa biti stavek tipa
Entry<Tabela1>().HasMany(m => m.PropertyTipaICollectionTabela2KiSeNahajaVTabeli1).WithOne(o => o.PropertyTipaTabela1KiSeNahajavTabeli2).HasForegnKey(k => k.TujKljuc)
Lahko pa greš tudi v kontra smeri.
Ko in šele ko obstaja relacijskaPovezava lahko uporabljaš Include. Če tega nimaš je Join najboljši približek.
acookook ::
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated> #nullable disable using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; using Models.DatabaseModels; namespace Models.Data { public partial class testContext : DbContext { public testContext() { } public testContext(DbContextOptions<testContext> options) : base(options) { } public virtual DbSet<Tabela2> Tabela2 { get; set; } public virtual DbSet<Tabela1> Tabela1 { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Tabela2>(entity => { entity.ToTable("Tabela2"); entity.Property(e => e.PartGroup) .IsRequired() .HasMaxLength(50) .IsUnicode(false); }); modelBuilder.Entity<Tabela1>(entity => { entity.ToTable("Tabela1"); entity.HasIndex(e => e.IdentifierCode, "UQ__T1__83428AF530") .IsUnique(); entity.Property(e => e.ShopUrl) .HasMaxLength(100) .IsUnicode(false); entity.HasOne(d => d.Tabela2) .WithMany(p => p.Tabela1) .HasForeignKey(d => d.GroupNameId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_GroupNameId"); }); OnModelCreatingGeneratedProcedures(modelBuilder); OnModelCreatingGeneratedFunctions(modelBuilder); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); } }
Če je kje kaka napaka, sem malo prilagodil, je pa to kar mi tale tool generira.
.
Zgodovina sprememb…
- spremenil: acookook ()
acookook ::
oz. nekaj takega
var result1 = _ctx.Tabela1.Include(...).Where()....
in potem
return result.select().orderbydescending()....toList()?
Dejansko nekaj takega deluje.
Izgleda, da ne vem pravilno istočasno sfiltrirati podatke in takoj premapirati v določeno obliko.
.
Zgodovina sprememb…
- spremenil: acookook ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Asp.netOddelek: Programiranje | 2011 (694) | acookook |
» | [C# in baze] - NasvetOddelek: Programiranje | 1540 (889) | HotBurek |
» | [C#] Entity FrameworkOddelek: Programiranje | 958 (789) | frudi |
» | C# tabelaOddelek: Programiranje | 1011 (863) | Mitja Bonča |
» | MYSQL vprašanjeOddelek: Programiranje | 1797 (1412) | MrBrdo |