» »

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
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...

detroit ::

zahteve stranke, nič hardcoded, ne vemo userja ne gesla
Skero

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!

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č,..

detroit ::

Skero

sebastjan28 ::

Prosim sporoči, kako ste rešili,..

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.
Skero

acookook ::

Potrebujem iz več propertyjev iz tabele1, zraven pa še en property iz tabele2.
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.
.

darkolord ::

Include bi moral biti OK. Kakšen error točno dobiš?

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
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, ignoriraj - ali posamezen element ali nastavi ReferenceHandler na IgnoreCycles.

acookook ::

Ok, če je kak bolj proper bi se pa tudi priporočal.
.

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. 8-O Bom izklopil, kar me sicer zelo moti.
.

darkolord ::

Kako pa nafilaš, da se uporablja serializer?

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 ::

darkolord je izjavil:

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.
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:
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".
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.

acookook ::

Se pravi .tolist().where().tolist()?
.

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 ()

acookook ::

To je tudi res. Se pravi procedura?
.

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.

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()?
.

acookook ::

oz. nekaj takega
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
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 ::

Ja tale Has Many imam v fileu, ki ga reverse engineera EF Core Power Tools iz baze.
.

luli ::

Ja kaj pa tisto dalje hasforeignkey?

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 ()

luli ::

In kaj vrne tabela1.include(x=>x.Tabela2).tolist()?

acookook ::

acookook je izjavil:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Asp.net

Oddelek: Programiranje
182007 (690) acookook
»

[C# in baze] - Nasvet

Oddelek: Programiranje
211538 (887) HotBurek
»

[C#] Entity Framework

Oddelek: Programiranje
6955 (786) frudi
»

C# tabela

Oddelek: Programiranje
51011 (863) Mitja Bonča
»

MYSQL vprašanje

Oddelek: Programiranje
131794 (1409) MrBrdo

Več podobnih tem