PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
Luboš Hnědý:6. dubna 11:41

Zdravím používám EF a potřeboval bych, aby se mi nenačítali závislosti. Zkrátka aby ty objekty byly null. a já si je popřípadě mohl dotáhnout pomocí .Include.
Příklad:

public class Project
  {
      public int ID { get; set; }

      public string Name { get; set; }

      public string Description { get; set; }
  }

public class Folder
  {
      [Key]
      [Column("ID", TypeName = "int")]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int ID { get; set; }

      [Column("Name", TypeName = "nvarchar(255)")]
      [Required]
      public string Name { get; set; }

      [Column("ID_Project", TypeName = "int")]
      [Required]
      [ForeignKey("Project")]
      public int ID_Project { get; set; }

      public virtual Project Project { get; set; }
  }

A jediné co chci, tak je aby se mi vlastnost Project nenačítala pokud si například zavolám GetAll() Je toto nějak možné v DB contextu? Popřípadě si to tam dodělám pomocí Include. Předem díky za rady a info. Díky

Zkusil jsem: Heldat na googlu ale nějak to nemůžu najít.

Chci docílit: Zvýšení rychlosti a menší nápor na db

 
Odpovědět 6. dubna 11:41
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Luboš Hnědý
vajkuba1234:6. dubna 19:25

To nejsou zavislosti...

Ty hledas toto
https://www.google.com/search?…

Nahoru Odpovědět 6. dubna 19:25
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Ilja Židkov
Člen
Avatar
Ilja Židkov:7. dubna 6:16

Zákazat lazy loading v Entity Frameworku je snadné. Příkládam požadovanou implementaci včetně vysvětlení a několik dobrých konvencí :)

PlaygroundCon­text.cs

public class PlaygroundContext : DbContext
{
     public PlaygroundContext()
     {
            // Zakážeme lazy loading po dobu existence kontextu.
            //Configuration.LazyLoadingEnabled = true;
     }

       public DbSet<Project> Projects { get; set; }
       public DbSet<Folder> Folders { get; set; }
}

Project.cs

public class Project
{
        public int Id { get; set; }

        [Required, StringLength(255)]
        public string Name { get; set; }

        [Required, StringLength(255)]
        public string Description { get; set; }

        // Kosmetika.
        public override string ToString() => $"{Id}-{Name}-{Description}";
}

Folder.cs

public class Folder
{
        // Není třeba aplikovat datové anotace.
        // Entity Framework aplikuje všechna potřebná nastavení
        // pro správnou funkčnost ID.
        public int Id { get; set; }

        [Required, StringLength(255)]
        public string Name { get; set; }

        public int ProjectId { get; set; }

        // Nemůžeme v tomto případě použít "virtual". Způsobilo by to lazy loading.
        //public virtual Project Project { get; set; }

        public Project Project { get; set; }

        // Kosmetika.
        public override string ToString() => $"{Id}-{Name}-{ProjectId}-{Project.Name}";
}

Program.cs

class Program
{
        static void Main(string[] args)
        {
            // Jelikož kontext reprezentuje připojení k externímu zdroji,
            // měli bychom ho také včas uvolnit (context.Dispose()).
            // Klauzule using(disposable) tuto operaci udělá za nás.
            using (var context = new PlaygroundContext())
            {
                // Načteme všechny složky...
                var folders = context.Folders

                    // pomocí INNER JOIN (Include()) přidáme projekty...
                    .Include(p => p.Project)

                    // sputíme SELECT dotaz.
                    .ToList();

                // Itereujeme skrz načtené složky a přidané projekty...
                foreach(var folder in folders)
                    // a vypíšeme načtené objekty na konzoli
                    // *pozn. ToString() čistě z kosmetického důvodu.
                    Console.WriteLine(folder.ToString());
            }


            Console.ReadKey();
}

Výsledny SQL dotaz:

SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name],
    [Extent1].[ProjectId] AS [ProjectId],
    [Extent2].[Id] AS [Id1],
    [Extent2].[Name] AS [Name1],
    [Extent2].[Description] AS [Description]
    FROM  [dbo].[Folders] AS [Extent1]
    INNER JOIN [dbo].[Projects] AS [Extent2] ON [Extent1].[ProjectId] = [Extent2].[Id]

Výstup

ID složky - název složky - ID projektu - název projektu

1-Folder1-1-Project1
2-Folder2-2-Project2
3-Folder3-3-Project3
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 7. dubna 6:16
Avatar
Odpovídá na Ilja Židkov
Luboš Hnědý:8. dubna 18:04

Děkuju za super vysvětlení. Dělám furt asi něco špatně... Model jsem upravil, jak píšeš. A pokud provedu dotaz:

using (var context = new PlaygroundContext())
  {
      var folders = context.Folders.ToList();
  }

Tak mi to vrátí stejně naplněnou vlastnost Project

 
Nahoru Odpovědět 8. dubna 18:04
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Luboš Hnědý
vajkuba1234:9. dubna 0:13

V konstruktoru sveho db contextu nastav

Configuration.LazyLoadingEnabled = false;
Editováno 9. dubna 0:13
Nahoru Odpovědět 9. dubna 0:13
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Ilja Židkov
Člen
Avatar
Ilja Židkov:9. dubna 9:21

vajkuba1234

Povolení lazy loadingu nezpůsobí nic (jak je to obvykle v programování), musíš ho také využít.

Viz. dokumentace, kterou jsi sdílel:

When using POCO entity types, lazy loading is achieved by creating instances of derived proxy types and then overriding virtual properties to add the loading hook.


Luboš Hnědý

Jsi si jist, že nepoužívaš nikde virtuální modifikátor? Jakmile zavoláš metodu .ToList(), ihned to způsobí SQL dotaz.

Jakmile vstoupíš do foreach() cyklu, Project je null. Čili výsledek musí být NullReference­Exception.

Předpokládám, že se bavíme o Entity Frameworku 6, že?

 
Nahoru Odpovědět  +1 9. dubna 9:21
Avatar
Odpovídá na Ilja Židkov
Luboš Hnědý:9. dubna 10:35

Zapomněl jsem napsat, že používám .net core :( Za to se omlouvám... Kde je to asi jiný? A ano používám EF 6.

 
Nahoru Odpovědět 9. dubna 10:35
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Luboš Hnědý
Ilja Židkov:9. dubna 12:29

používám .net core

A ano používám EF 6

Tohle si protiřečí.


V čem vyvíjíš? Visual Studio? Podívej se do Solution Explorer > Dependencies > NuGet (pokud to máš v angličtině)

Souvisí tam něco s Entity Framework.**?

Který druh projektu používáš? Konzolová aplikace? ASP .NET Core?


Dostat Lazy Loading do Coru není jednoduchá záležitost a navíc, je to novinka (.NET Core 2+).

Ať dělám, co dělám. Project je vždycky null => NullReference­Exception.

Odstranil jsi tento řádek?

public virtual Project Project { get; set; }
 
Nahoru Odpovědět 9. dubna 12:29
Avatar
Odpovídá na Ilja Židkov
Luboš Hnědý:9. dubna 16:21

Sem fakt blb ty jo.. Omlouvám se... Dělám v .net core Razor Pages a používám Microsoft.Enti­tyFrameworkCo­re 2.2.3
Ale jsem asi naprostej idiot, normálně mi to funguje.Nevím jestli jsem upravil ViewModel. Fakt se omlouvám a děkuji za super radu!

 
Nahoru Odpovědět 9. dubna 16:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.