Blazor, EF6 en json. List<> could not be mapped.

Pagina: 1
Acties:

Onderwerpen

Vraag


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Ik zit met een vraag hoe ik onderstaande "netjes" oplos.

Ik ben bezig met een applicatie in Blazor te maken voor het beheer van spelkaarten en decks.
Ik maak gebruik van een online repository waar alle kaart definities in staan.
Deze gebruik ik om mijn lokale repo up-to-date te houden.

Deze online repo kan ik afvragen middels JSON.
Van die JSON heb ik 1 op 1 objecten gemaakt (http://json2csharp.com/) zodat ik deze eenvoudig kan Deserializen. Laten we dit een "card" noemen.
Dit resulteert in een list met cards.

De cards zelf hebben ook een aantal velden die als List worden opgeslagen.
Te denken aan color_identity, een kaart kan hier meerdere van hebben.
En hier gaat het mis.

Ik wil deze kaarten opslaan in mijn lokale repo.
Hiervoor gebruik ik EntityFramework.
Voorheen had ik mijn eigen structuur die prima via EF richting de database werd opgeslagen.
Deze gebruikte namelijk geen lists.

Wanneer ik een Add-Migration uitvoer krijg ik de volgende foutmelding:
The property could not be mapped, because it is of type 'List<object>'


De melding is uiteraard volledig terecht.
Maar wat is nou de mooie manier om dit op te lossen? Ik kan alle kanten op wel van alles gaan beknutselen, rechttrekken en wrappertjes voor bouwen.
Maar ik ben toch niet de eerste die zo iets probeert, hier moet toch een mooiere oplossing voor zijn.


Ik gebruik Visual Studio 2019 Preview
Ik heb het internet al afgestruind naar mogelijkheden, ik kom ook wel oplossingen tegen waarmee het op te lossen is. Maar het zijn veel al custom oplossingen voor elk individuele probleem/veld.
Ik ben eigenlijk opzoek naar een nette oplossing voor het probleem.

Beste antwoord (via Armageddon_2k op 22-08-2019 14:16)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:51:
Laatste updates voor Blazor, verder niet specifieks
Daar heb je toch geen VS2019 preview voor nodig? Kan toch prima op de RTM?
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:51:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Card
    {
        public string @object { get; set; }
        public string id { get; set; }
        private List<int> multiverse_ids { get; set; }
        public int tcgplayer_id { get; set; }
        public bool highres_image { get; set; }
        public ImageUris image_uris { get; set; }
        public string mana_cost { get; set; }
        public List<object> colors { get; set; }
        private List<object> color_identity { get; set; }
        Etc..
    }
Ik zie daar 2 keer een List<object> (colors en color_identity). Why :? Waarom hebben die geen type?

Verder werkt @object vast wel, maar 't is vragen om problemen. Is er geen betere naam voor die property te verzinnen? Ik zou dan iets doen als:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Card
{
    [JsonProperty("object")]
    public string Foo { get; set; }

    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("tcgplayer_id")]
    public int TheCoolGamePlayerId { get; set; }

    ...
}

Waarbij je dus de json key "object" naar de property "Foo" zet; dan heb je dus geen "object" property meer op je Card (nodig). En als bonus heb ik er nog een paar bij gezet zodat je kunt zien hoe je je JSON properties naar nette .Net convention properties kunt mappen.

[ Voor 26% gewijzigd door RobIII op 22-08-2019 12:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Allereerst: zou je willen stoppen met na elke zin op enter te meppen? Dat leest vrij vervelend. Je kunt tekstomloop prima aan 't forum overlaten ;)

Verder zie ik niet hoe Blazor en JSON hier (en een groot deel van je verhaal) relevant zijn. Je hebt gewoon een probleem met EF6 en een List<T>. Graag zou ik dus een stukje relevante(!) code zien (hoe zien je classes eruit?). En wat heb je dan al gevonden waarmee 't op te lossen is en hoe is dat niet in te zetten voor jouw probleem? Is het niet aan te passen zodat 't een "nette" oplossing (whatever that may be) is?

Waar ik vooral benieuwd naar ben is waarom 'ie zeurt over een List<object> en niet over List<Card> of whatever. Als je het mij vraagt zit daar je probleem.
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:13:
De melding is uiteraard volledig terecht.
Daar is voor ons, op basis van de informatie die je ons tot nu toe hebt gegeven, anders weinig zinnigs over te zeggen ;) Dus relevante(!) code/classes zijn wel welkom.
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:13:
Van die JSON heb ik 1 op 1 objecten gemaakt (http://json2csharp.com/) zodat ik deze eenvoudig kan Deserializen.
In Visual Studio kun je gewoon "Paste JSON as classes" doen ;)
Is er een specifieke reden waarom je Preview gebruikt en niet gewoon de RTM / "final" :? Just curious.

[ Voor 34% gewijzigd door RobIII op 22-08-2019 11:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 11:19:
Allereerst: zou je willen stoppen met na elke zin op enter te meppen? Dat leest vrij vervelend. Je kunt tekstomloop prima aan 't forum overlaten ;)
Will do.
Verder zie ik niet hoe Blazor en JSON hier (en een groot deel van je verhaal) relevant zijn. Je hebt gewoon een probleem met EF6 en een List<T>. Graag zou ik dus een stukje relevante(!) code zien (hoe zien je classes eruit?). En wat heb je dan al gevonden waarmee 't op te lossen is en hoe is dat niet in te zetten voor jouw probleem? Is het niet aan te passen zodat 't een "nette" oplossing (whatever that may be) is?
Klopt, LIST<T> is het probleem. Maar ik ben juist hier opzoek, of ik de juiste richting wel op aan het kijken ben. Moet ik richting EF een wrapper maken, of moet uit juist aan de JSON kant een aanpassing doorvoeren.
In Visual Studio kun je gewoon "Paste JSON as classes" doen ;)
Handig, die kende ik helemaal nog niet.
Is er een specifieke reden waarom je Preview gebruikt en niet gewoon de RTM / "final" :? Just curious.
Laatste updates voor Blazor, verder niet specifieks
Waar ik vooral benieuwd naar ben is waarom 'ie zeurt over een List<object> en niet over List<Card> of whatever. Als je het mij vraagt zit daar je probleem.

Daar is voor ons, op basis van de informatie die je ons tot nu toe hebt gegeven, anders weinig zinnigs over te zeggen ;) Dus relevante(!) code/classes zijn wel welkom.

Daar is voor ons, op basis van de informatie die je ons tot nu toe hebt gegeven, anders weinig zinnigs over te zeggen ;) Dus relevante(!) code/classes zijn wel welkom.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public class CardBaseContext : DbContext
    {
        public virtual DbSet<Card> tblCards { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Server=localhost\\SQLEXPRESS;Database=TcgData;Trusted_Connection=True;MultipleActiveResultSets=true");
            }
        }
    }
    
        
    public class Card
    {
        public string @object { get; set; }
        public string id { get; set; }
        private List<int> multiverse_ids { get; set; }
        public int tcgplayer_id { get; set; }
        public bool highres_image { get; set; }
        public ImageUris image_uris { get; set; }
        public string mana_cost { get; set; }
        public List<object> colors { get; set; }
        private List<object> color_identity { get; set; }
        Etc..
    }

Bij deze het deel uit de code. De class is vanuit de JSON gegenereerd. Deze probeer ik middels een Add-Migration naar de database te krijgen en dan krijg ik de foutmelding. Eigenlijk is dat de basis van de fout. De rest van mijn verhaal is puur context. Één van de voorbeelden die ik op Internet tegen kom, is deze JSON class via deserilize laden. Daarna een nieuwe wrapperclass te maken die gelijk is aan de JSON class, maar alle lists converteert naar een comma separated string. Alleen voelt dit een beetje knutselen. Ik ben dus benieuwd of er een manier is om 1op1 een mapping te maken tussen json en een EF gekoppelde database.

[ Voor 6% gewijzigd door RobIII op 22-08-2019 11:52 . Reden: Zwik minder interessante code verwijderd ]


  • Merethil
  • Registratie: December 2008
  • Laatst online: 11:08
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:51:
[...]

Will do.


[...]


Klopt, LIST<T> is het probleem. Maar ik ben juist hier opzoek, of ik de juiste richting wel op aan het kijken ben. Moet ik richting EF een wrapper maken, of moet uit juist aan de JSON kant een aanpassing doorvoeren.


[...]

Handig, die kende ik helemaal nog niet.


[...]

Laatste updates voor Blazor, verder niet specifieks


[...]

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public class CardBaseContext : DbContext
    {
        public virtual DbSet<Card> tblCards { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Server=localhost\\SQLEXPRESS;Database=TcgData;Trusted_Connection=True;MultipleActiveResultSets=true");
            }
        }
    }
    
        
    public class Card
    {
        public string @object { get; set; }
        public string id { get; set; }
        private List<int> multiverse_ids { get; set; }
        public int tcgplayer_id { get; set; }
        public bool highres_image { get; set; }
        public ImageUris image_uris { get; set; }
        public string mana_cost { get; set; }
        public List<object> colors { get; set; }
        private List<object> color_identity { get; set; }
        Etc..
    }

Bij deze het deel uit de code. De class is vanuit de JSON gegenereerd. Deze probeer ik middels een Add-Migration naar de database te krijgen en dan krijg ik de foutmelding. Eigenlijk is dat de basis van de fout. De rest van mijn verhaal is puur context. Één van de voorbeelden die ik op Internet tegen kom, is deze JSON class via deserilize laden. Daarna een nieuwe wrapperclass te maken die gelijk is aan de JSON class, maar alle lists converteert naar een comma separated string. Alleen voelt dit een beetje knutselen. Ik ben dus benieuwd of er een manier is om 1op1 een mapping te maken tussen json en een EF gekoppelde database.
Wat moet EF precies maken van een list met objects? Normaalgesproken maak je dan een aparte klasse die je via een Many-To-Many (met koppeltabel) in je database propt. Of als elke color specifiek voor één card is, dan krijg je een one-to-many (zonder koppeltabel, elke color krijgt een verwijzing naar de parent card)

De melding is dus dat EF niets met een list van object types kan.

Een comma-separated-string kan wel, maar is ongelofelijk vies. En dan zou je een getter/setter moeten maken die een String bouwen en teruggeven aan de hand van de gegeven list zodat die gebruikt kunnen worden voor het vullen en uitlezen van de kolom in de tabel.

[ Voor 5% gewijzigd door Merethil op 22-08-2019 11:56 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:51:
Laatste updates voor Blazor, verder niet specifieks
Daar heb je toch geen VS2019 preview voor nodig? Kan toch prima op de RTM?
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 11:51:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Card
    {
        public string @object { get; set; }
        public string id { get; set; }
        private List<int> multiverse_ids { get; set; }
        public int tcgplayer_id { get; set; }
        public bool highres_image { get; set; }
        public ImageUris image_uris { get; set; }
        public string mana_cost { get; set; }
        public List<object> colors { get; set; }
        private List<object> color_identity { get; set; }
        Etc..
    }
Ik zie daar 2 keer een List<object> (colors en color_identity). Why :? Waarom hebben die geen type?

Verder werkt @object vast wel, maar 't is vragen om problemen. Is er geen betere naam voor die property te verzinnen? Ik zou dan iets doen als:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Card
{
    [JsonProperty("object")]
    public string Foo { get; set; }

    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("tcgplayer_id")]
    public int TheCoolGamePlayerId { get; set; }

    ...
}

Waarbij je dus de json key "object" naar de property "Foo" zet; dan heb je dus geen "object" property meer op je Card (nodig). En als bonus heb ik er nog een paar bij gezet zodat je kunt zien hoe je je JSON properties naar nette .Net convention properties kunt mappen.

[ Voor 26% gewijzigd door RobIII op 22-08-2019 12:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 11:54:
[...]

Daar heb je toch geen VS2019 preview voor nodig? Kan toch prima op de RTM?
Ik heb braaf de Get started guide gevolgd, dus vandaar.
https://docs.microsoft.co...re-3.0&tabs=visual-studio
[...]
Ik zie daar 2 keer een List<object> (colors en color_identity). Why :? Waarom hebben die geen type?

Verder werkt @object vast wel, maar 't is vragen om problemen. Is er geen betere naam voor die property te verzinnen?
https://scryfall.com/docs/api
Dat heb objecten zijn, komt vanwege die online converter. De optie die jij gaf voor paste as class resulteert wel netjes in een:
C#:
1
public string[] colors { get; set; }

Dat komt rechtstreeks uit de API van de online repo. Heb ik ook niet bedacht.
c# wordt ook al niet zo blij van "set_name", omdat name {get; set;} hier ook in resulteert.

Het leek me gewoon zo lekker makkelijk om een JSON vanaf die site 1-op-1 in te lezen en naar mijn database te knallen. Alleen gaat dat helaas niet op.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
public class Card
{
    [JsonProperty("object")]
    public string Foo { get; set; }

    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("tcgplayer_id")]
    public int TheCoolGamePlayerId { get; set; }
    
}

Dit is wel de mooiste oplossing denk ik, en dan richting de database gaan converteren als een samengestelde string. Voorkomt het maken van meerdere classes die eigenlijk het zelfde doen. Hier kan ik wel wat mee. Doordat ik de classes vanuit JSOn altijd genereer, had ik helemaal niet over [JsonProperty] nagedacht.

[ Voor 19% gewijzigd door Armageddon_2k op 22-08-2019 12:04 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 12:01:
Dat heb objecten zijn, komt vanwege die online converter
Je ziet toch dat EF zeurt over een List<object> en dan ga jij niet kijken naar waar die voorkomt en wat 't eigenlijk zou moeten zijn volgens jou :?
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 12:01:
Het leek me gewoon zo lekker makkelijk om een JSON vanaf die site 1-op-1 in te lezen en naar mijn database te knallen. Alleen gaat dat helaas niet op.
Tja, programmeren is je hoofd gebruiken ;) Als je er wil komen met copy/pasten zonder na te denken dan ga je nog een hoop van dit soort topics openen ;)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 12:01:
Dat heb objecten zijn, komt vanwege die online converter. De optie die jij gaf voor paste as class resulteert wel netjes in een:
C#:
1
public string[] colors { get; set; }
Ik ken verder je hele project niet, en het werkt nu vast wel, maar ik durf te betwijfelen of dit wél het juiste type is (string). Komen de waardes uit een vaste set? Dan is 't vast beter een enum te gebruiken hier.

Edit: linkje gevolgd. Ja hoor. Ik zou er een enum van maken.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum Color
{
    White = 'W',
    Blue = 'U',
    Black = 'B',
    Red = 'R',
    Green = 'G',
}

class Card {
    ...
    [JsonProperty("colors")]
    public Color[] Colors { get; set; }
    ...
}
Moet je even kijken of dat standaard goed gaat, maar ik denk dat je dan een (simpele) JsonConverter moet implementeren voor Color.

Overigens zijn die JsonProperties niet nodig zolang 't alleen maar verschillen in upper/lowercase betreft als ik me goed herinner. Ik zet ze er echter eigenlijk wel altijd op; ik ben liever wat explicieter dan dat ik alles maar aan toeval/defaults overlaat :P

[ Voor 46% gewijzigd door RobIII op 22-08-2019 12:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 12:03:
[...]
Je ziet toch dat EF zeurt over een List<object> en dan ga jij niet kijken naar waar die voorkomt en wat 't eigenlijk zou moeten zijn volgens jou :?
Ja wel, had ik ook al gedaan. Kopie van voorbeeld was oude code. List<String> wordt door EF ook niet geaccepteerd. Dus ik had het niet aangepast in het voorbeeld.
RobIII schreef op donderdag 22 augustus 2019 @ 12:03:

Ik ken verder je hele project niet, en het werkt nu vast wel, maar ik durf te betwijfelen of dit wél het juiste type is (string). Komen de waardes uit een vaste set? Dan is 't vast beter een enum te gebruiken hier.

Edit: linkje gevolgd. Ja hoor. Ik zou er een enum van maken.
C#:
1
2
3
4
5
6
7
8
public enum Color
{
    White = 'W',
    Blue = 'U',
    Black = 'B',
    Red = 'R',
    Green = 'G',
}
Helemaal mee eens, alleen er zijn nog iets van 10Lists die niet over te zetten zijn naar een enum. Zo heb je bijvoorbeeld een List<int> van multiverse_id. En daarnaast gaat een List<Color> alsnog hetzelfde probleem geven. Een kaart kan meerdere colors hebben. Vandaar dat ik me eerst maar eens bezig ben gaan houden met het oplossen van het overzetten van een List<> naar EF.

[ Voor 56% gewijzigd door Armageddon_2k op 22-08-2019 12:13 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 12:06:
Helemaal mee eens, alleen er zijn nog iets van 10Lists die niet over te zetten zijn naar een enum. Zo heb je bijvoorbeeld een List<int> van multiverse_id.
Een id is ook helemaal geen Enum? (of je moet een vaste set met X "multiverses" hebben). Maar een color (je hebt kennelijk maar 5 mogelijke/geldige waardes) is dat wél.

Sterker nog: de API waar je naar verwijst definieert 't type ook als "Colors" en definieert ook de waardes (waar ik mijn enum op baseerde) 8)7
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 12:06:
En daarnaast gaat een List<Color> alsnog hetzelfde probleem geven.
Wie heeft 't over een List<Color>? Ik postte toch een Color[] array?

En nu we toch bezig zijn: ik zou van legalities ook een enum maken, ook al zegt de documentatie "Object"; de mogelijke waardes staan gewoon gedefinieerd: legal, not_legal, restricted, banned.
C#:
1
2
3
4
5
6
public enum Legality {
    Legal,
    Notlegal,
    Restricted,
    Banned
}
Idem: JsonConvertertje (if required) voor maken en gaan. En zo zijn er nog wel een paar.

Met alleen "Paste JSON as class" ga je er niet komen als je 't een beetje fatsoenlijk/netjes wil doen. Je zult echt je grijze massa moeten aanwenden; zo'n "Paste JSON as class" (of json2csharp.com for that matter) kan ook maar tot op bepaalde hoogte gokken wat de bedoeling is; er is te weinig informatie in de JSON aanwezig om fatsoenlijke code van te breien.

[ Voor 44% gewijzigd door RobIII op 22-08-2019 12:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 12:16:
Wie heeft 't over een List<Color>? Ik postte toch een Color[] array?
Klopt, niet goed verwoord, ik bedoelde array. Die levert gewoon dezelfde foutmelding. EF kan namelijk ook niet overweg met arrays.
The property 'Card.colors' could not be mapped, because it is of type 'Color[]' which is not a supported primitive type or a valid entity type.
Met alleen "Paste JSON as class" ga je er niet komen als je 't een beetje fatsoenlijk/netjes wil doen. Je zult echt je grijze massa moeten aanwenden; zo'n "Paste JSON as class" (of json2csharp.com for that matter) kan ook maar tot op bepaalde hoogte gokken wat de bedoeling is; er is te weinig informatie in de JSON aanwezig om fatsoenlijke code van te breien.
Ja, ben er bang voor. Ik had de hoop dat er een makkelijkere stap was. Los van de nog niet bestaande enums, ik loop tegen meer en meer issues aan bij het 1-op-1 overzetten van de JSON. Dus ik denk dat ik maar ga voor de oplossing van [JsonProperty("")] en dan een conversie waar nodig.

Eigenlijk heeft dit verhaal me dus wel tot een andere oplossing geleid. Ik wilde eerst de EF kant oplossen. Maar ik ga het nu zo maken dat EF het snapt en dat ik de JSON kant oplos.

Dus bedankt voor het meedenken :)

[ Voor 6% gewijzigd door Armageddon_2k op 22-08-2019 14:15 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op donderdag 22 augustus 2019 @ 14:14:
EF kan namelijk ook niet overweg met arrays.
Ik doe niet heel veel met EF maar dat maak je mij niet wijs. Zélfs niet als je bedoelde te zeggen "arrays van enums". Dat moet gewoon werken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 14:15:
[...]

Ik doe niet heel veel met EF maar dat maak je mij niet wijs. Zélfs niet als je bedoelde te zeggen "arrays van enums". Dat moet gewoon werken.
Ik krijg toch echt de melding:
The property 'Card.colors' could not be mapped, because it is of type 'Color[]' which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace MtgManager.Shared
{
    public class Card
    {
        public string _object { get; set; }
        public string id { get; set; }
        public string oracle_id { get; set; }
        public int tcgplayer_id { get; set; }
        public string card_name { get; set; }
        public string lang { get; set; }
        public string released_at { get; set; }
        public string card_uri { get; set; }
        public string scryfall_uri { get; set; }
        public string layout { get; set; }
        public bool highres_image { get; set; }
        public string mana_cost { get; set; }
        public float cmc { get; set; }
        public string type_line { get; set; }
        public string oracle_text { get; set; }
        public Color[] colors { get; set; }
        Etc..
    }

    public enum Color
    {
        White = 'W',
        Blue = 'U',
        Black = 'B',
        Red = 'R',
        Green = 'G',
    }
}

[ Voor 47% gewijzigd door Armageddon_2k op 22-08-2019 14:18 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik geloof wel dat je die melding krijgt, maar dat betekent hooguit dat je iets verkeerd doet / anders doet dan EF het verwacht. Dat er misschien wat 'extra werk' nodig is om EF te "kneden" te werken met enums geloof ik best, maar het moet echt wel werken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 15:01

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op donderdag 22 augustus 2019 @ 14:17:
[...]

Ik geloof wel dat je die melding krijgt, maar dat betekent hooguit dat je iets verkeerd doet / anders doet dan EF het verwacht. Dat er misschien wat 'extra werk' nodig is om EF te "kneden" te werken met enums geloof ik best, maar het moet echt wel werken.
O, ik had verwacht dat het aan de array lag. Ik duik er nog even in. Ik had een test gedaan met een array van int. En daar liep hij direct op stuk. Vandaar die aanname.

C#:
1
2
3
4
5
6
    public class Card
    {
        public string _object { get; set; }
        public string id { get; set; }
        public int[] colors { get; set; }
    }

The property 'Card.colors' could not be mapped, because it is of type 'int[]' which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

Even opgezocht. EF kan inderdaad niet overweg met arrays. Je moet deze zelf samenstellen. Dit betekent de array als [NotMapped] taggen. En dan de samenstelling als public naar EF.
code:
1
2
3
    private string _concattedColors;
    [NotMapped]
    public string[] colors { get; set; }

Hierbij wordt _concattedColors opgeslagen in de database. En de array bestaat alleen in het c# object. Dat ik wat ik eerder bedoelde met "truukjes", maar dat was waarschijnlijk niet helemaal helder.

[ Voor 19% gewijzigd door Armageddon_2k op 22-08-2019 14:26 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Moet je er dan geen virtual ICollection<Color> (of <int> of whateverdefuck) van maken? Dan zou 'ie volgens mij een nieuwe tabel moeten maken (zoals 't hoort, normalisatie enzo) en zou 't volgens mij gewoon moeten werken. Maar nogmaals: geen EF expert.

[ Voor 3% gewijzigd door RobIII op 22-08-2019 14:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 10:40
Als ik het zo een beetje correct lees en begrijp, wil je dus per card een reeks kleuren opslaan? Deze kleuren staan nu als enum gedefinieerd. Dus je wilt een lijst van enums opslaan per card. Daar heb je enkele oplossingen voor, maar het is wel belangrijk om te weten dat je met EF werkt. Ik veronderstel eventjes dat 't EF Core is, maar dat zou niet al te veel mogen uitmaken qua oplossing.
Er zijn er namelijk enkele:
- Sla de enums comma separated op (kan je doen met een leuke converter)
- Sla de enums op als flag (dan hoef je geen comma separation te doen), maar je kan helaas geen volgorde specificeren.
- Sla de enums op in een aparte tabel (CardId, Enum). Als je wilt kan je hier nog meer kennis aan tevoegen. Maar dit is meestal een overkill solution.

Voor zover ik weet kan EF niet default overweg met lists (tenzij die uit entities bestaan).

Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Het meest logische lijkt mij om van Color een entiteit te maken, zodat deze als een many to many relatie gemapt kan worden.

Hoe is de performance van Blazor tot nu toe? Lijkt me best heavy om een hele .Net runtime als wasm te downloaden en uit te voeren.

Gaaf dat het kan, daar niet van :) Als iemand JavaScript graag ziet sterven, ben ik het wel. Maar ja, zal nog wel lang duren voordat het zover is... (en ik ben nog Silverlight verdrietig)

Wellicht dat Golang oid veel compacter zal zijn dan .Net.

[ Voor 9% gewijzigd door Lethalis op 25-08-2019 19:48 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Lethalis schreef op zondag 25 augustus 2019 @ 19:45:
Hoe is de performance van Blazor tot nu toe? Lijkt me best heavy om een hele .Net runtime als wasm te downloaden en uit te voeren.
Vziw nog steeds slecht. Iets van 2 MB aan IL om te downloaden die daarna nog naar bytecode omgezet moet worden. Zou fijn zijn als MS eens werk ging maken van class pruning en static ahead-of-time compilation, zoals ze elke keer weer opnieuw aanhalen, maar vooralsnog niets nieuws uit die hoek.

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 12:38
Als ik in de documentatie kijk van de API dan zie ik ook de volgende kaarten:

https://scryfall.com/card/grn/221/assure-assemble . Deze heeft 2x Groen of Wit in de kaart staan. Maar het is ook een dual kaart, die andere mogelijkheden heeft. Je zult dus het model van een kaart kleur markering beter moeten modelleren, als je hier meer wilt doen. :)
Pagina: 1