EF Core – Parameter vom Typ Enum Array als String Array (string[]) anstelle von Int Array (int[]) in der DatenbankC#

Ein Treffpunkt für C#-Programmierer
Guest
 EF Core – Parameter vom Typ Enum Array als String Array (string[]) anstelle von Int Array (int[]) in der Datenbank

Post by Guest »

Ich versuche, ein Enum[] in string[] und zurück in Enum[] umzuwandeln, aber wenn Werte in der Datenbank konvertiert werden, werden sie als int[] konvertiert. was sich in Bezug auf die Zuverlässigkeit ändern kann. Wenn ein Element im Enum-Typ später entfernt wird, führt der Offset dazu, dass alle Werte nach diesem Index ungültig werden und nicht nur „ein“ Element, das möglicherweise in einen Standardwert umgewandelt wird. Daher würde ich gerne jedes Enum[] in string[] konvertieren, ähnlich wie string.Join.
Allerdings scheint der Prozess für einen solchen zu kompliziert zu sein einfache Aufgabe.
Ich frage mich, ob ich etwas verpasst habe?
Beispiel in EF Core:

Code: Select all

public enum EntityEnum
{
One,
Two,
Three
}

public class Entity
{
public EntityEnum[] Items { get; set; }

public static void GetEntityBuilder(EntityTypeBuilder entity)
{
entity.Property(e => e.Items)
.HasMaxLength(100)
.HasDefaultValue(null)
.ValueGeneratedNever()
.IsRequired(false);
}
}
In der Datenbank ist dies „[0, 1, 2]“ für:

Code: Select all

new EntityEnum[] { EntityEnum.One, EntityEnum.Two, EntityEnum.Three }
aber es sollte „[Eins, Zwei, Drei]“ sein. Wenn also Two irgendwann entfernt wird, ist Three immer noch Three und nicht 1.
Ich habe es manuell mit HasConversion versucht, wie ich bereits sagte, aber es scheint zu kompliziert zu sein. Am Ende ist ein ValueComparer (für einen String) erforderlich. Außerdem kann das Ändern der Standardkonvertierung dazu führen, dass einige integrierte Selektoren beschädigt werden, und so weiter? Deshalb möchte ich so viel wie möglich intakt halten.
Gibt es dafür eine Lösung? Oder hänge ich an einer manuellen Konvertierung, die möglicherweise einige Abfragen zum Scheitern bringt, die mithilfe eines in der Datenbank gespeicherten int[] unterstützt werden könnten?
Aktualisierung mit einigen Klarstellungen:
  • Enums sind erwünscht, da sie vom Code gesteuert werden und Strings anonym sind
  • Bitmask / HasFlag EntityEnum tut dies unterstützt keine Sortierung des gespeicherten Arrays (nein, nicht DESC / ASC in einer Datenbank), aber als normale Zeichenfolge, die für die Ausgabe verwendet wird
  • Lesbarkeit wird bevorzugt, da diese möglicherweise nicht abgefragt, sondern möglicherweise für eine externe Suchmaschine exportiert wird, die später die Analyse übernimmt
    Lesbarkeit wird bevorzugt und es werden keine Abfragen in dieser Spalte als OF THIS MOMENT verwendet – aber die Frage bleibt bestehen, falls sich das später ändert.
Zweck der Frage
HasConversion ist die bevorzugte Methode, nach der ich frage. Ohne benutzerdefinierten ValueComparer/ValueConverter – welche Arten von Abfragen werden unterstützt, wenn EntityEnum[] als [0, 1, 2] in der Datenbank gespeichert wird, und warum werden sie nicht unterstützt, wenn EntityEnum[] als [One, Two, Three] oder [ gespeichert wird? Drei, zwei, eins]? Und gibt es eine Möglichkeit, Unterstützung für ähnliche Abfragen hinzuzufügen, und warum nicht? Der Standard-JSON-Serialisierer verarbeitet heute auf magische Weise jeden String, der mit jedem Enum übereinstimmt. Wenn beide Abfragen, die „funktionieren“, im Code erfolgen, sehe ich den Zweck von HasConversion nicht, wenn dadurch integrierte Konvertierungen unterbrochen werden. Wenn die Abfrage in eine tatsächliche SQL-Abfrage übersetzt wird, ist das eine ganz andere Sache. Aber andererseits könnte es diese Konvertierung wahrscheinlich genauso gut bewältigen, wenn es int[], string[] gibt, da es sich am Ende immer noch um eine Varchar-Spalte handelt (technisch gesehen sind alles nur Strings). Es muss auch dort etwas Magie bewirken und es in etwas abfragbares umwandeln, wenn es die Abfrage in der tatsächlichen Datenbank durchführt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post