Entity Framework: enregistrements en double dans une relation plusieurs-à-plusieurs
J'ai suivantes entity framework code first code. Les tables sont créées et les données sont insérées. Cependant, il existe des enregistrements en double dans la table Club.
Mes activités sont:-
- De créer des clubs club application de création de
- Créer de personnes à l'aide de la personne d'application
Comment éviter l'entrée en double?
static void Main(string[] args)
{
Database.SetInitializer<NerdDinners>(new MyInitializer());
CreateClubs();
InsertPersons();
}
public static void CreateClubs()
{
string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
using (var db = new NerdDinners(connectionstring))
{
Club club1 = new Club();
club1.ClubName = "club1";
Club club2 = new Club();
club2.ClubName = "club2";
Club club3 = new Club();
club3.ClubName = "club3";
db.Clubs.Add(club1);
db.Clubs.Add(club2);
db.Clubs.Add(club3);
int recordsAffected = db.SaveChanges();
}
}
public static Club GetClubs(string clubName)
{
string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
using (var db = new NerdDinners(connectionstring))
{
//var query = db.Clubs.Where(p => p.ClubName == clubName);
var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName);
return query;
}
}
public static void InsertPersons()
{
string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
using (var db = new NerdDinners(connectionstring))
{
Club club1 = GetClubs("club1");
Club club2 = GetClubs("club2");
Club club3 = GetClubs("club3");
Person p1 = new Person();
p1.PersonName = "Person1";
Person p2 = new Person();
p2.PersonName = "Person2";
List<Club> clubsForPerson1 = new List<Club>();
clubsForPerson1.Add(club1);
clubsForPerson1.Add(club3);
List<Club> clubsForPerson2 = new List<Club>();
clubsForPerson2.Add(club2);
clubsForPerson2.Add(club3);
p1.Clubs = clubsForPerson1;
p2.Clubs = clubsForPerson2;
db.Persons.Add(p1);
db.Persons.Add(p2);
int recordsAffected = db.SaveChanges();
}
}
Domaine
public class Person
{
public int PersonId { get; set; }
public string PersonName { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public string ClubName { get; set; }
public virtual ICollection<Person> Members { get; set; }
}
//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
public NerdDinners(string connString): base(connString)
{
}
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
//Fluent API - Plural Removal
modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<Person> Persons { get; set; }
public DbSet<Club> Clubs { get; set; }
}
source d'informationauteur Lijo
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous créez plusieurs contextes.
Tout d'abord vous créer des clubs. C'est ok. Mais lorsque vous créez personnes, vous allez chercher les clubs via
GetClubs
mais pour chaque club vous de jeter le réel de l'entité cadre de contexte, de sorte que vous vous retrouvez avec du recul des entités. AuInsertPersons
vous ajoutez détaché club des entités à de nouvelles personnes, de sorte que le contexte actuel ne pense que les clubs sont des clubs.Ainsi, lorsque vous ajoutez un club à une personne que vous en fait de créer de nouveaux clubs.
C'est parce que entity framework assure le suivi des changements et gère les entités par le contexte. Si vous ajoutez une entité à un contexte qui ne contient pas encore là, il va la traiter comme une nouvelle entité.
En fait, vous devriez faire quelque chose comme ça (pas testé):
De sûr, vous devriez refactoriser la structure de ce code, mais s'il vous plaît, notez que je utilisez uniquement un contexte EF pour mes opérations.
Grâce à @PeterPorfy
Également lire Une Exception de type 'System.ObjectDisposedException'
J'ai utilisé
pour attacher les objets du contexte précédent.
Un exemple pour IEntityWithKey que j'ai utilisé est comme suit. S'il vous plaît commentaire si vous voyez un problème avec cette approche.
Veuillez consulter ci-après également