web-dev-qa-db-fra.com

ajout d'une liste d'objets au contexte dans ef

Est-il possible d'ajouter une liste d'objets au contexte dans le cadre d'entité sans utiliser foreach addObject?

merci pour l'aide

29
gruber

En général, vous ne pouvez pas faire cela - vous devez le faire en boucle. Dans certains cas, cependant, vous pouvez éviter d'ajouter tous les objets, en particulier si vous avez un graphique d'entité et que vous ajoutez le nœud parent. Par exemple. si vous avez un objet Company qui a une collection de Employees:

context.AddToCompanies(company);

/* The following loop is not necessary */
/* The employees will be saved together with the company */
/*
foreach (var employee in company.Employees)
{
    context.AddToEmployees(employee);
}*/

context.SaveChanges();
15
Yakimych

Depuis EntityFramework 6, vous pouvez utiliser méthode DbSet.AddRange (IEnumerable) comme ceci

db.companies.AddRange(newCompanies);
34
naveen

En utilisant linq et quelques lambdas, vous pouvez facilement l'ensemencer comme ceci.

Remarque: en ce qui concerne votre version actuelle, vous pouvez le faire

List<Company> companies = new List<Company>();

companies.ForEach(n => context.AddToCompanies(n));

C'est la façon dont je fais avec Entity Framework 4.1 ou supérieur avec l'approche Code First

List<RelationshipStatus> statuses = new List<RelationshipStatus>()
{
    new RelationshipStatus(){Name = "Single"},
    new RelationshipStatus(){Name = "Exclusive Relationship"},
    new RelationshipStatus(){Name = "Engaged"},
    new RelationshipStatus(){Name = "Married"},
    new RelationshipStatus(){Name = "Open Relationship"},
    new RelationshipStatus(){Name = "Commited Relationship"}
};

statuses.ForEach(n => myContext.RelationshipStatuses.Add(n));
myContext.SaveChanges();

Le contexte a été configuré comme suit

public class MyContext:DbContext
{
     public DbSet<RelationshipStatus> RelationshipStatuses{ get; set; }
}
9
Max Alexander

Vous pouvez le faire via la propriété de navigation. J'ai rencontré le même problème et je ne me sentais pas bien en utilisant des boucles.

Si vous avez une table Student et une table Subject. Vous aurez une relation un à plusieurs entre l'élève de la table et le sujet de la table respectivement. Une propriété de navigation dans la table Student sera public IEnumerable<Subject> Subjects {get; set;} et une propriété de navigation dans la table Subject sera public Student Student {get;set;}.

Si vous souhaitez utiliser la boucle, vous utiliserez la propriété de navigation Student, et si vous souhaitez ajouter toutes les instances de Subjects dans la table Subjects avec l'étudiant correspondant, vous utiliserez la propriété de navigation Subjects .

Comment utiliser? Supposons que vous ayez des objets prêts à mapper, je veux dire que vous avez ajouté les champs dans Student et dans Subjects.

Maintenantstudent.Subjects = subjects' then add student using yourDbContext` OU Comme expliqué dans la réponse @Yakimych ci-dessus (commentée cependant).

Je n'ai pas implémenté cela dans EF mais dans EF Core 3.1. Cependant, la plupart des futurs lecteurs bénéficieront de cette réponse, y compris ceux qui utilisent EF et non EF Core.

0
Imran Faruqi