IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Štěpánek:12.10.2016 17:17

Ahoj, snažím se přetvořit svoji firemní aplikaci z WebForms do MVC a přemýšlím nad tvorbou a provazováním tabulek. Když chci do tabulky požadavků dát jen uživatele (autora požadavku) s vazbou na tabulku Users, je to jednoduché

public int AutorId { get; set; }
public virtual User User { get; set; }

Jak to ale mám provést, když chci do té samé tabulky dát i admina, resp. operátora, který daný požadavek vyřizuje (který je ve stejné tabulce Users)? Má se tam dávat další virtuální User nebo se použije ten první virtual? Když tam dám další řádek s virtual User, vytvoří se mi i fyzicky v tabulce v DB a to já nechci... Může mi prosím někdo poradit? Děkuji

Editováno 12.10.2016 17:18
Odpovědět
12.10.2016 17:17
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Jan Vargovský:12.10.2016 17:57

Jak to ale mám provést, když chci do té samé tabulky dát i admina ... vytvoří se mi i fyzicky v tabulce v DB a to já nechci ...

Odkud teda budeš tahat toho operátora?

 
Nahoru Odpovědět
12.10.2016 17:57
Avatar
Odpovídá na Jan Vargovský
Michal Štěpánek:12.10.2016 20:27

Z tabulky Users (třída User). Myslel jsm, že udělám toto

public int AutorId { get; set; }
public virtual User Autor { get; set; }
public int OperatorId { get; set; }
public virtual User Operator { get; set; }

ale to mi do tabulky požadavků vytvoří sloupce AutorId, OperatorId a Operator. Já bych rád, aby tam byla jen ty AutorId a OperatorId...

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
12.10.2016 20:27
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Jan Vargovský
Michal Štěpánek:12.10.2016 20:35

Tak nic, asi jsem tupej, ale takhle, jak jsem to napsal v minulém příspěvku mi to najednou maká tak, jak má... Asi jsem něco před tím dělal špatně. Omlouvám se za zbytečné vlákno...

Nahoru Odpovědět
12.10.2016 20:35
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michal Štěpánek:13.10.2016 10:32

Tak teď už to vážně nechápu.
Když udělám třídu Printer

public class Printer
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key()]
        public int PrinterId { get; set; }
        [Required(ErrorMessage = "Označení tiskárny musí být uvedeno")]
        [StringLength(100, ErrorMessage = "Označení tiskárny je příliš dlouhé")]
        [Display(Name = "Označení tiskárny")]
        public string PrinterName { get; set; }
        [Display(Name = "Barevná")]
        public bool Color { get; set; }
        [Display(Name = "Black toner")]
        public int BlackId { get; set; }
        public virtual Cartridge Black { get; set; }
        [Display(Name = "Yellow toner")]
        public int? YellowId { get; set; }
        public virtual Cartridge Yellow { get; set; }
        [Display(Name = "Cyan toner")]
        public int? CyanId { get; set; }
        public virtual Cartridge Cyan { get; set; }
        [Display(Name = "Magenta toner")]
        public int? MagentaId { get; set; }
        public virtual Cartridge Magenta { get; set; }
        [Display(Name = "Aktivní")]
        public bool Active { get; set; }

        [Display(Name = "Poznámka")]
        [MaxLength()]
        public string PrinterNote { get; set; }
    }

tak mi to při migraci navrhne takovéto vytvoření tabulky

CreateTable(
                "dbo.Printers",
                c => new
                    {
                        PrinterId = c.Int(nullable: false, identity: true),
                        PrinterName = c.String(nullable: false, maxLength: 100),
                        Color = c.Boolean(nullable: false),
                        BlackId = c.Int(nullable: false),
                        YellowId = c.Int(),
                        CyanId = c.Int(),
                        MagentaId = c.Int(),
                        Active = c.Boolean(nullable: false),
                        PrinterNote = c.String(),
                        Black_CartridgeId = c.Int(),
                        Cyan_CartridgeId = c.Int(),
                        Magenta_CartridgeId = c.Int(),
                        Yellow_CartridgeId = c.Int(),
                    })
                .PrimaryKey(t => t.PrinterId)
                .ForeignKey("dbo.Cartridges", t => t.Black_CartridgeId)
                .ForeignKey("dbo.Cartridges", t => t.Cyan_CartridgeId)
                .ForeignKey("dbo.Cartridges", t => t.Magenta_CartridgeId)
                .ForeignKey("dbo.Cartridges", t => t.Yellow_CartridgeId)
                .Index(t => t.Black_CartridgeId)
                .Index(t => t.Cyan_CartridgeId)
                .Index(t => t.Magenta_CartridgeId)
                .Index(t => t.Yellow_CartridgeId);

v podstatě ten problém, který jsem popisoval v prvním příspěvku vlákna.
Nevíte někdo, co dělám blbě?
Ještě pro úplnost třída Cartridge

public class Cartridge
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key()]
        public int CartridgeId { get; set; }

        //číslo toneru
        [Required(ErrorMessage = "Označení toneru musí být uvedeno")]
        [StringLength(50, ErrorMessage = "Označení toneru je příliš dlouhé")]
        [Display(Name = "Označení toneru")]
        public string CartridgeNumber { get; set; }
        //popis toneru - názvy tiskáren
        [StringLength(255, ErrorMessage = "Popis toneru je příliš dlouhý")]
        [Display(Name = "Popis toneru")]
        public string CatridgeDescription { get; set; }
        //barva
        [Display(Name = "Barva")]
        [Required(ErrorMessage = "Barva toneru musí být uvedena")]
        public string CartridgeColor { get; set; }
        //skladem
        [Range(0, int.MaxValue, ErrorMessage = "Stav skladu nesmí být záporný")]
        [Display(Name = "Skladem ks")]
        public int Stock { get; set; }
        //minimální stav
        [Range(0, int.MaxValue, ErrorMessage = "Minimální stav skladu nesmí být záporný")]
        [Display(Name = "Minimální stav")]
        public int MinStock { get; set; }
        //aktivní
        public bool Active { get; set; }
        //rezervace
        [Range(0, int.MaxValue, ErrorMessage = "Rezervace nesmí být záporná")]
        [Display(Name = "Rezervováno")]
        public int Resrvation { get; set; }

        [Display(Name = "Poznámka")]
        [MaxLength()]
        public string CartridgeNote { get; set; }

    }
Editováno 13.10.2016 10:34
Nahoru Odpovědět
13.10.2016 10:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:13.10.2016 18:23

ja ti budu reagovat. ale libit se ti to nebude..

  1. Vubec nepouzivej automaticke migrace
  2. Idealne nepouzivej kodove migrace, ale nechavej si vygenerovat SQL a ten rucne poustej
  3. Nepouzivej attributy ve tride, protoze:
    1. je to hnusne
    2. tim lockujes objekt automaticky na Entity Framework
    3. je dost neprehledny, jaky klic je k cemu.. u vetsich DB uz je to hodne neprehledny a musis scorllovat jak posuk
  4. Misto attributu pouzivej configurace

Proč ti to píšu? protože v konfiguracich to co chces udelas jednoduse, funguje to na 100% a je naprosto pochopitelné jak to funguje:

//RequestConfiguration.cs
 HasRequired(a => a.Author)
 .WithMany(b=>b.AuthorInRequests)
 .HasForeignKey(c=>c.AuthorId);

 HasRequired(a => a.Operator)
 .WithMany(b=>b.OperatorInRequests)
 .HasForeignKey(c=>c.OperatorId);

a User.cs:

public virtual  List<Request> AuthorInRequests {get; set;} // Requesty kde je autorem
public virtual  List<Request> OperatorInRequests {get; set;} // Requesty kde je operatorem
Editováno 13.10.2016 18:25
Nahoru Odpovědět
13.10.2016 18:23
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:13.10.2016 19:29

Migrace dělám ručně, ale stejně mi přijde to MVC strašně složité... No nic, budu asi muset zůstat u webforms...

Nahoru Odpovědět
13.10.2016 19:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:13.10.2016 19:30

Tak toto úplně asi nesouvisí s frontendem.. To je věc dalu. Tento problém budeš mít i u webforms,..

Nahoru Odpovědět
13.10.2016 19:30
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:13.10.2016 19:48

Ale u webforms používám klasické SQL příkazy a DB tvořím ručně. Entity Framework pro mě asi není to pravé ořechové...

Nahoru Odpovědět
13.10.2016 19:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Marian Benčat:13.10.2016 20:06

:-) Entity framework by ti usnadnil život hodně (pokud se ho naučíš ovládat), ale na vše se také nehodí.

http://www.entityframeworktutorial.net/

Z tohodle se to během pár hodin naučíš..

  • tady jsou konfigurace:

http://www.entityframeworktutorial.net/…e-first.aspx

Ono je to easy jakmile se to naučíš.

Nahoru Odpovědět
13.10.2016 20:06
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:13.10.2016 20:13

Díky za rady, mrknu se na to, bo vím, že webforms už se vyvíjet nebudou a přechod na MVC mě bude čekat tak, jako tak (tím pádem i Entity Framework je nutností se naučit) Už se do toho snažím proniknout taaak dlouho a taaak marně... 8-|

Nahoru Odpovědět
13.10.2016 20:13
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
JMS
Člen
Avatar
Odpovídá na Michal Štěpánek
JMS:14.10.2016 9:42

Entity framework není nutností, na výběr máš spoustu jiných alternativ :)

 
Nahoru Odpovědět
14.10.2016 9:42
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:14.10.2016 14:26

Hmm jestli jsi takto vydeseny z MVC,.. tak az uvidis, ze soucasny svet se zene do posran*ho javascript toolingu , kterej vecne nefunguje, je pomalej jako svine a vytuhava.. tak se poseres :D

Nahoru Odpovědět
14.10.2016 14:26
Totalitní admini..
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 13 zpráv z 13.