NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: ASP .NET MVC Entity Framework - zapnutí migrací na jednou z dvou projektů v řešení

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Martin Hroch
Člen
Avatar
Martin Hroch:9.8.2017 14:05

Zdravím,
Mám problém s Entity Framework se zapnutím migrací

Mám v řešení dva projekty. Projekt.Model a Projekt.WEB. V Projekt.Model mám složku a v ní mám všechny modely jenž potřebuji (User.cs, Quest.cs atd.). V Projekt.WEB chci mít jen samotnou logiku stránek.
A potřebuji, aby se Projekt.Model staral o komunikaci s databází a Projekt.WEB se bude starat jen o vyřizování požadavků atd.
A můj problém je v zapnutí migrací. Potřebuji tedy docílit, aby se jen Projekt.WEB staral o komunikaci s databází. Nastavil jsem Projekt.WEB jako spouštěný a spustil konzoli.V konzoli jsem jako výchozí projekt zvolil Projekt.Model a zadal Enable-Migrations což nefungovalo jelikož chybí kontext (No context type was found in the assembly 'Projekt.Model').
Entity Framework jsem pomocí NuGet přidal do obou řešení. Projekt.WEB má přidán odkaz (referenci) na Projekt.Model. Zkoušel jsem Projekt.Model založit jako knihovnu tříd (class library) i jako normální projekt a ani na jednom mi to nefungovalo.

Existuje tedy nějaké řešení, abych mohl zapnout migrace na Projekt.Model?
Může být problémem i to, že jsem zatím v Projekt.WEB nevytvořil žádný controller, který by pracoval s třídami v Projekt.Model?
A je lepší mít Projekt.Model jako class library nebo jako webovou aplikaci?

Předem děkuji za odpovědi :)

 
Odpovědět
9.8.2017 14:05
Avatar
zelvicek
Člen
Avatar
zelvicek:9.8.2017 16:06

Uff, to je ale počteníčko :-)
Domnívám se, že tu došlo k několika nepochopení. Tož do nich:

  1. Máš uvedeno "A potřebuji, aby se Projekt.Model staral o komunikaci s databází..." a kousek níže "Potřebuji tedy docílit, aby se jen Projekt.WEB staral o komunikaci s databází.". Tož jak?
  2. No context type was found in the assembly 'Projekt.Model'.
  3. A je lepší mít Projekt.Model jako class library nebo jako webovou aplikaci?

Začnem v opačném pořadí.
3. Představ si, že Projekt.Model chceš použít/referencovat z webové i jiných aplikací (desktopová aplikace, nějaká Win služba, ...). Z toho jasně vyplývá, že to musí být Class library.
2. Kdepak se ta třída s kontextem zatoulala? Nesmazals ji náhodou? Každopádně by měla být pospolu se ostatníma třídama v Class library.

1. Projekt.WEB bude referencovat Projekt.Model a bude tedy mít přístup k třídě ModelDbContext (nebo jak sis toho potomka DbContext nazval). A bude záviset jen na Projekt.WEB, jak ten ModelDbContext instancovat.

Snad se v těch odpovědích trošku vyznáš.

Editováno 9.8.2017 16:06
 
Nahoru Odpovědět
9.8.2017 16:06
Avatar
Martin Hroch
Člen
Avatar
Martin Hroch:9.8.2017 19:06

Ahoj :)
Děkuji za reakci.

  1. Opravdu se stala chyba na drátě a upsal jsem se. Project.Model bude vždy ten který se bude starat o komunikaci s databází. A projektu Projekt.WEB bude pak úplně jedno jak to tam vypadá ten se bude už jen ptát na data od něj.
  2. No když jsem vytvořil novou class library tak to je prázdný projekt jen a pouze s jednou třídou která je prázdná:
using System;

namespace Project.Dummy
{
    public class Class1
    {
    }
}

Takže buď je třída s kontextem někde schovaná nebo je jinde.
A nebo jí budu muset ručně vytvořit. Což asi spíše.

Ovšem když jí ručně vytvořím tak poté budu muset v ní i ručně definovat jednotlivé tabulky pokud se nemýlím?
Takže bych do jejího obsahu musel napsat pro každou třídu:

public DbSet<User> Users { get; set; }

Něco podobného jsem již tedy zkoušel, ale onu třídu jsem měl uloženou v Project.WEB.
A poté byl problém s automaticky vygenerovaným souborem. Ovšem pokud onen kontext vytvořím přímo v Silver.Model tak to je OK. Díky :)

Takže když jsem onen kontext soubor vytvořil v Project.Model s obsahem:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace Project.Model.Data
{
    class ProjectContext : DbContext
    {
        public ProjectContext() : base()
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

Tak se mi podaří spustit Enable-Migrations. A automaticky se mi vytvoří složka Migrations a v ní Configuration.cs
A teď asi nejzásadnější otázka? Budu muset pro každou mojí třídu psát onen kód: public DbSet<User> Users { get; set; } popřípadě použít fluent API nebo teď stačí zadat Add-Migration a už si to samo vytvoří potřebné tabulky a ostatní závislosti?

Ještě pro upřesnění používám VS 2017 a EF v6.1.3.

 
Nahoru Odpovědět
9.8.2017 19:06
Avatar
Odpovídá na Martin Hroch
Michal Štěpánek:10.8.2017 6:03

Mrkni se do prvních několika lekcí tutoriálu E-shop v ASP.NET MVC, tam je to dosti podrobně popsáno, jak se to rozděluje a referencuje...

Nahoru Odpovědět
10.8.2017 6:03
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Shade
Člen
Avatar
Shade:10.8.2017 9:33

Code first - musíš všechny ty třídy napsat do DbContextu
Database first - DbContext se ti sám vytvoří

Nahoru Odpovědět
10.8.2017 9:33
Talk is cheap. Show me the code.
Avatar
Martin Hroch
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin Hroch:10.8.2017 11:53

Ahoj, kdyby nebyly placené a měl bych dostatek bodů na odemknutí tak se kouknu.
Ovšem zatím platit kreditkou nemám možnost a smskou to u vyšších částek nejde.
Jinak jsem tam samozřejmě již nahlídl do toho co bylo otevřené.

 
Nahoru Odpovědět
10.8.2017 11:53
Avatar
zelvicek
Člen
Avatar
Odpovídá na Shade
zelvicek:11.8.2017 11:17

K tomu Code first - na jednom ASP.NET Core projektu jsem použil VS extension "EntityFramework Reverse POCO Generator". Ten to za tebe napíše sám :-)

 
Nahoru Odpovědět
11.8.2017 11:17
Avatar
Odpovídá na Martin Hroch
Michal Štěpánek:12.8.2017 10:21

Do Contextu musíš pro každou třídu napsat

DbSet<Trida> Nazev_tabulky { get; set; }

pak ti to z té třídy tabulku vygeneruje

Nahoru Odpovědět
12.8.2017 10:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
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 8 zpráv z 8.