Avatar
Michal Štěpánek:

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. října 17:18
Odpovědět 12. října 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ý
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Jan Vargovský:

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. října 17:57
Avatar
Odpovídá na Jan Vargovský
Michal Štěpánek:

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  +1 12. října 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:

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. října 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:

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. října 10:34
Nahoru Odpovědět 13. října 10:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:

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. října 18:25
 
Nahoru Odpovědět 13. října 18:23
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:

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. října 19:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:

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. října 19:30
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:

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. října 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
Redaktor
Avatar
Marian Benčat:

:-) 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  +2 13. října 20:06
Avatar
Odpovídá na Marian Benčat
Michal Štěpánek:

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. října 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:

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

 
Nahoru Odpovědět 14. října 9:42
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Marian Benčat:

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  +1 14. října 14:26
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.