J'ai écrit une telle classe:
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"
};
}
}
et
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
Après l'exécution du code:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
mes données sont enregistrées mais juste le fichier Id
. Je n'ai pas de tables ni de relations applicables à la liste des chaînes .
Qu'est-ce que je fais mal? J'ai aussi essayé de faire des cordes virtual
mais cela n'a rien changé.
Merci de votre aide.
c#
.net
entity-framework
Paul
la source
la source
Test
entité. Alors créez une nouvelle entité avecId
propriété etMyString
propriété, puis faites une liste de cela.Réponses:
Entity Framework ne prend pas en charge les collections de types primitifs. Vous pouvez créer une entité (qui sera enregistrée dans une table différente) ou effectuer un traitement de chaîne pour enregistrer votre liste sous forme de chaîne et remplir la liste une fois l'entité matérialisée.
la source
EF Core 2.1+:
Propriété:
OnModelCreating:
la source
Cette réponse est basée sur celles fournies par @Sasan et @CAD bloke .
Fonctionne uniquement avec EF Core 2.1+ (non compatible avec .NET Standard) (Newtonsoft
JsonConvert
)En utilisant la configuration fluide EF Core, nous sérialisons / désérialisons le
List
vers / depuis JSON.Pourquoi ce code est le mélange parfait de tout ce que vous pouvez rechercher:
la source
var result = await context.MyTable.Where(x => x.Strings.Contains("findme")).ToListAsync();
ne trouve rien.Je sais que c'est une vieille question, et Pawel a donné la bonne réponse , je voulais juste montrer un exemple de code sur la façon de traiter des chaînes et éviter une classe supplémentaire pour la liste d'un type primitif.
la source
,
(virgule) dans les chaînes. Si une chaîne de la liste contient une ou plusieurs,
(virgules), la chaîne est divisée en plusieurs chaînes.string.Join
la virgule devrait être entouré par des guillemets doubles (pour une chaîne), pas apostrophes (pour un char). Voir msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspxJSON.NET à la rescousse.
Vous le sérialisez en JSON pour qu'il persiste dans la base de données et le désérialisez pour reconstituer la collection .NET. Cela semble fonctionner mieux que ce à quoi je m'attendais avec Entity Framework 6 et SQLite. Je sais que vous avez demandé
List<string>
mais voici un exemple de collection encore plus complexe qui fonctionne très bien.J'ai marqué la propriété persistante avec
[Obsolete]
donc il serait très évident pour moi que "ce n'est pas la propriété que vous recherchez" dans le cours normal du codage. La propriété "real" est étiquetée avec[NotMapped]
donc Entity Framework l'ignore.(tangente non liée): Vous pourriez faire la même chose avec des types plus complexes, mais vous devez vous demander si vous avez simplement rendu l'interrogation des propriétés de cet objet trop difficile pour vous? (oui, dans mon cas).
la source
Juste pour simplifier -
Le cadre d'entité ne prend pas en charge les primitives. Vous créez une classe pour l'encapsuler ou ajoutez une autre propriété pour mettre en forme la liste sous forme de chaîne:
la source
Bien sûr, Pawel a donné la bonne réponse . Mais j'ai trouvé dans cet article que depuis EF 6+, il est possible de sauvegarder des propriétés privées. Je préférerais donc ce code, car vous ne pouvez pas enregistrer les chaînes de manière incorrecte.
la source
StringsAsStrings
ne sera mis à jour que lorsque laStrings
référence est modifiée, et le seul moment dans votre exemple qui se produit est lors de l'affectation. L'ajout ou la suppression d'éléments de votreStrings
liste après l'attribution ne mettra pas à jour laStringsAsStrings
variable de sauvegarde. La bonne façon d'implémenter cela serait d'exposerStringsAsStrings
comme une vue de laStrings
liste, au lieu de l'inverse. Joignez les valeurs ensemble dans l'get
accesseur de laStringsAsStrings
propriété et divisez-les dans l'set
accesseur.Tordant légèrement @Mathieu Viales de » la réponse , voici un extrait standard .NET compatible à l' aide de la nouvelle sérialiseur System.Text.Json éliminant ainsi la dépendance à l' égard Newtonsoft.Json.
Notez que bien que le deuxième argument dans les deux
Serialize()
etDeserialize()
soit généralement facultatif, vous obtiendrez une erreur:Définir explicitement cela sur la valeur par défaut (null) pour chacun efface cela.
la source
Vous pouvez utiliser ce
ScalarCollection
conteneur qui limite un tableau et fournit des options de manipulation ( Gist ):Usage:
Code:
la source
NET462
par l'environnement approprié ou de l'ajouter à celui-ci.