Ich habe eine solche Klasse geschrieben:
class Test
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public List<String> Strings { get; set; }
public Test()
{
Strings = new List<string>
{
"test",
"test2",
"test3",
"test4"
};
}
}
und
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
Nach dem Ausführen von Code:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
Meine Daten werden gespeichert, aber nur die Id
. Ich habe keine Tabellen oder Beziehungen, die für die Strings- Liste gelten.
Was mache ich falsch? Ich habe auch versucht, Strings zu machen, virtual
aber es hat nichts geändert.
Danke für Ihre Hilfe.
c#
.net
entity-framework
Paul
quelle
quelle
Test
Entität verwiesen. Erstellen Sie also eine neue Entität mitId
Eigenschaft undMyString
Eigenschaft und erstellen Sie eine Liste davon.Antworten:
Entity Framework unterstützt keine Sammlungen primitiver Typen. Sie können entweder eine Entität erstellen (die in einer anderen Tabelle gespeichert wird) oder eine Zeichenfolgenverarbeitung durchführen, um Ihre Liste als Zeichenfolge zu speichern und die Liste zu füllen, nachdem die Entität materialisiert wurde.
quelle
EF Core 2.1+:
Eigentum:
OnModelCreating:
quelle
Diese Antwort basiert auf denen von @Sasan und @CAD .
Funktioniert nur mit EF Core 2.1+ (nicht .NET Standard-kompatibel) (Newtonsoft
JsonConvert
)Unter Verwendung der fließenden EF Core-Konfiguration serialisieren / deserialisieren wir das
List
zu / von JSON.Warum dieser Code die perfekte Mischung aus allem ist, was Sie anstreben könnten:
quelle
var result = await context.MyTable.Where(x => x.Strings.Contains("findme")).ToListAsync();
findet nichts.Ich weiß, dass dies eine alte Frage ist, und Pawel hat die richtige Antwort gegeben . Ich wollte nur ein Codebeispiel für die Verarbeitung von Zeichenfolgen zeigen und eine zusätzliche Klasse für die Liste eines primitiven Typs vermeiden.
quelle
,
in Zeichenfolgen (Komma) steht. Wenn eine Zeichenfolge in der Liste eine oder mehrere,
Zeichenfolgen (Komma) enthält, wird die Zeichenfolge in mehrere Zeichenfolgen aufgeteilt.string.Join
Komma sollten doppelte Anführungszeichen (für eine Zeichenfolge) und keine einfachen Anführungszeichen (für ein Zeichen) stehen. Siehe msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspxJSON.NET zur Rettung.
Sie serialisieren es in JSON, um in der Datenbank zu bleiben, und deserialisieren es, um die .NET-Sammlung wiederherzustellen. Dies scheint mit Entity Framework 6 und SQLite besser zu funktionieren, als ich erwartet hatte. Ich weiß, dass Sie danach gefragt haben,
List<string>
aber hier ist ein Beispiel für eine noch komplexere Sammlung, die einwandfrei funktioniert.Ich habe die persistierte Eigenschaft mit markiert,
[Obsolete]
sodass es für mich sehr offensichtlich ist, dass "dies nicht die Eigenschaft ist, nach der Sie suchen" im normalen Verlauf der Codierung. Die "echte" Eigenschaft ist mit gekennzeichnet,[NotMapped]
sodass das Entity-Framework sie ignoriert.(nicht verwandte Tangente): Sie könnten dasselbe mit komplexeren Typen tun, aber Sie müssen sich fragen, haben Sie es sich nur zu schwer gemacht, die Eigenschaften dieses Objekts abzufragen? (Ja, in meinem Fall).
quelle
Nur zur Vereinfachung -
Das Entity Framework unterstützt keine Grundelemente. Sie erstellen entweder eine Klasse zum Umschließen oder fügen eine weitere Eigenschaft hinzu, um die Liste als Zeichenfolge zu formatieren:
quelle
Natürlich hat Pawel die richtige Antwort gegeben . Aber ich habe in diesem Beitrag festgestellt, dass es seit EF 6+ möglich ist, private Immobilien zu speichern. Daher würde ich diesen Code bevorzugen, da Sie die Zeichenfolgen nicht falsch speichern können.
quelle
StringsAsStrings
wird nur aktualisiert, wenn dieStrings
Referenz geändert wird, und das einzige Mal in Ihrem Beispiel, das passiert, ist die Zuweisung. Durch Hinzufügen oder Entfernen von Elementen zu IhrerStrings
Liste nach der Zuweisung wird die Sicherungsvariable nicht aktualisiertStringsAsStrings
. Der richtige Weg, dies zu implementieren, besteht darin, esStringsAsStrings
als Ansicht derStrings
Liste anzuzeigen und nicht umgekehrt. Verbinden Sie die Werte imget
Accessor derStringsAsStrings
Eigenschaft und teilen Sie sie imset
Accessor auf.Ein wenig zwicken @Mathieu Viales ‚s Antwort , hier ist ein .NET - Standard kompatibel Schnipsel des neuen System.Text.Json Serializer mit damit die Abhängigkeit von Newtonsoft.Json beseitigen.
Beachten Sie, dass das zweite Argument in beiden
Serialize()
undDeserialize()
normalerweise optional ist, Sie jedoch eine Fehlermeldung erhalten:Wenn Sie dies explizit auf den Standardwert (null) setzen, wird dies gelöscht.
quelle
Sie können diesen
ScalarCollection
Container verwenden, der ein Array begrenzt und einige Manipulationsoptionen bietet ( Gist ):Verwendung:
Code:
quelle
NET462
die entsprechende Umgebung ersetzen oder hinzufügen.