Qu'est-ce qui cause ce conflit de key étrangère dans mes données de base / mon model de database?

J'ai essayé pendant des heures maintenant mais je ne peux pas get mes données de graine pour fonctionner sur ma database d'Entity Framework.

Je continue à recevoir l'erreur suivante:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Appointment_dbo.Employee_EmployeeID". The conflict occurred in database "BezoekersDBContext", table "dbo.Employee", column 'ID'.

Plus grande partie de la trace de la stack:

System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the ensortinges. See the inner exception for details. ---> System.Data.Entity.Core.UpdateException: An error occurred while updating the ensortinges. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Appointment_dbo.Employee_EmployeeID". The conflict occurred in database "BezoekersDBContext", table "dbo.Employee", column 'ID'.

Un autre ennui:

Chaque fois que j'exécute update-database dans la console du gestionnaire de packages, il continue d'append la première partie des données de base, datatables de la table Employee . C'est pourquoi la table des employés a environ 6 inputs maintenant, mais les keys primaires de la table des employés sont 7,8,9,10,11 et 12. C'est peut-être / probablement une partie du problème. Je voudrais juste laisser tomber la database pour réinitialiser ces keys et l'append à nouveau en utilisant la update-database à update-database mais quand j'essaye de supprimer la database, j'obtiens une erreur indiquant que la database est utilisée.

Je suis au bout de mes peines ici. Je vais supprimer mon diagramme de database, les templates, Dbcontext, datatables de la table du server SQL et datatables de base. J'espère que vous pourrez m'aider. Si vous voyez des erreurs dans mon model, s'il vous plaît dites-moi aussi! Aidez un compasortingote à sortir!

J'ai lu cette question SO (C'était une question qui pourrait déjà avoir une réponse) et un user a dit que mes foreign keys devraient être nulles. Le mien ne peut pas être nul, ils sont tous nécessaires. Un autre user dit quelque chose sur la virtual mes propriétés de navigation, mais j'ai supprimé cela pour me débarrasser de cette erreur bizarre qui a empêché mon API Web de récupérer datatables de la database vers l'appelant:

Si vous avez des propriétés de navigation, faites-les non virtuelles. Le mappage fonctionnera toujours mais il empêche la création d'entités proxy dynamics qui ne peuvent pas être sérialisées. Ne pas avoir de chargement paresseux est bien dans un WebApi car vous n'avez pas de connection persistante et vous avez exécuté un .ToList () de toute façon.


Diagramme (Créé avec EF Power Tools):

Diagramme de ma base de données


DES MODÈLES

Visiteur

 public class Visitor { [Key] public int ID { get; set; } [Required] public ssortingng FirstName { get; set; } [Required] public ssortingng LastName { get; set; } //[Key] I have to configure this later [Required] [EmailAddress] public ssortingng Email { get; set; } public ssortingng Company { get; set; } public ssortingng Image { get; set; } public ssortingng PhoneNumber { get; set; } public ICollection<Appointment> Appointments { get; set; } } 

Rendez-vous

 public class Appointment { [Key] public int ID { get; set; } [Required] public int EmployeeID { get; set; } [Required] public ssortingng Location { get; set; } public ssortingng Comment { get; set; } [Required] public DateTime Date { get; set; } public ICollection<Visitor> Visitors { get; set; } public ICollection<Collector> Collectors { get; set; } [ForeignKey("EmployeeID")] public Employee Employee { get; set; } } 

Collectionneur

 public class Collector { [Key] public int ID { get; set; } [Required] public int AppointmentID { get; set; } [Required] public int EmployeeID { get; set; } [Required] public int Preference { get; set; } [ForeignKey("EmployeeID")] public Employee Employee { get; set; } [ForeignKey("AppointmentID")] public Appointment Appointment { get; set; } } 

Employé

 public class Employee { [Key] public int ID { get; set; } //[Key] I have to configure this later [Required] public int SAP_ID { get; set; } [Required] public ssortingng FirstName { get; set; } [Required] public ssortingng LastName { get; set; } [Required] [EmailAddress] public ssortingng Email { get; set; } public ssortingng Image { get; set; } [Required] public ssortingng PhoneNumber { get; set; } public ICollection<Appointment> Appointments { get; set; } } 

DbContext

 public class BezoekersDBContext : DbContext { public BezoekersDBContext() : base("BezoekersDBContext") { } public DbSet<Appointment> Appointments { get; set; } public DbSet<Employee> Employees { get; set; } public DbSet<Collector> Collectors { get; set; } public DbSet<Visitor> Visitors { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<Collector>().HasRequired(d => d.Employee).WithMany().WillCascadeOnDelete(false); } 

WillCascadeOnDelete est activé car un Collector est un Employee mais un Employee n'est pas toujours un Collector . (Un collectionneur est quelqu'un qui ramasse le visiteur et l'amène à l'endroit du rendez-vous, il est aussi un employé). Ne pas avoir activé cette option m'a donné des erreurs sur les loops et les paths en cascade et j'ai trouvé beaucoup de réponses SO me disant d'utiliser cette option pour résoudre ce problème.


Code SQL des tables

Visiteur

 CREATE TABLE [dbo].[Visitor] ( [ID] INT IDENTITY (1, 1) NOT NULL, [FirstName] NVARCHAR (MAX) NOT NULL, [LastName] NVARCHAR (MAX) NOT NULL, [Email] NVARCHAR (128) NOT NULL, [Company] NVARCHAR (MAX) NULL, [Image] NVARCHAR (MAX) NULL, [PhoneNumber] NVARCHAR (MAX) NULL, CONSTRAINT [PK_dbo.Visitor] PRIMARY KEY CLUSTERED ([ID] ASC) ); 

Rendez-vous

 CREATE TABLE [dbo].[Appointment] ( [ID] INT IDENTITY (1, 1) NOT NULL, [EmployeeID] INT NOT NULL, [Location] NVARCHAR (MAX) NOT NULL, [Comment] NVARCHAR (MAX) NULL, [Date] DATETIME NOT NULL, CONSTRAINT [PK_dbo.Appointment] PRIMARY KEY CLUSTERED ([ID] ASC), CONSTRAINT [FK_dbo.Appointment_dbo.Employee_EmployeeID] FOREIGN KEY ([EmployeeID]) REFERENCES [dbo].[Employee] ([ID]) ON DELETE CASCADE ); 

Collectionneur

 CREATE TABLE [dbo].[Collector] ( [ID] INT IDENTITY (1, 1) NOT NULL, [AppointmentID] INT NOT NULL, [EmployeeID] INT NOT NULL, [Preference] INT NOT NULL, CONSTRAINT [PK_dbo.Collector] PRIMARY KEY CLUSTERED ([ID] ASC), CONSTRAINT [FK_dbo.Collector_dbo.Employee_EmployeeID] FOREIGN KEY ([EmployeeID]) REFERENCES [dbo].[Employee] ([ID]), CONSTRAINT [FK_dbo.Collector_dbo.Appointment_AppointmentID] FOREIGN KEY ([AppointmentID]) REFERENCES [dbo].[Appointment] ([ID]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_AppointmentID] ON [dbo].[Collector]([AppointmentID] ASC); GO CREATE NONCLUSTERED INDEX [IX_EmployeeID] ON [dbo].[Collector]([EmployeeID] ASC); 

Employé

 CREATE TABLE [dbo].[Employee] ( [ID] INT IDENTITY (1, 1) NOT NULL, [SAP_ID] INT NOT NULL, [FirstName] NVARCHAR (MAX) NOT NULL, [LastName] NVARCHAR (MAX) NOT NULL, [Email] NVARCHAR (MAX) NOT NULL, [Image] NVARCHAR (MAX) NULL, [PhoneNumber] NVARCHAR (MAX) NOT NULL, CONSTRAINT [PK_dbo.Employee] PRIMARY KEY CLUSTERED ([ID] ASC) ); 

Données de semences

À l'heure actuelle, ma table Employé contient des lignes avec l'ID commençant à 7 parce que j'ai laissé tomber la database et j'ai beaucoup utilisé la database Update-Database par frustration. J'ai modifié l'exemple de code à venir pour correspondre à ces keys primaires.

Si quelqu'un a une meilleure solution que d'utiliser .Single(x => x.ID == NUMBERHERE); parce que je pourrais devoir changer cela si j'obtiens plus d'erreurs et augmente les augmentations automatiques, dites-moi s'il vous plaît! J'ai googlé beaucoup de solutions mais je n'ai rien trouvé!

  internal sealed class Configuration : DbMigrationsConfiguration<BezoekersRegistratie_BackEnd2.DAL.BezoekersDBContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(BezoekersDBContext context) { var employees = new List<Employee> { new Employee { FirstName="Jan", LastName="Scholten", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0675876573", SAP_ID= 20149203, Appointments = new List<Appointment>()}, new Employee { FirstName="Bart", LastName="de Vries", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0655544422", SAP_ID=20148394, Appointments = new List<Appointment>()}, new Employee { FirstName="Denke", LastName="Eekhoorn", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0674738383", SAP_ID=2039388, Appointments = new List<Appointment>() } }; employees.ForEach(e => context.Employees.AddOrUpdate(p => p.ID, e)); context.SaveChanges(); var appointments = new List<Appointment> { new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 7),Location = "Apeldoorn", Comment="Rolstoeltoegang is nodig!", Date = new DateTime(2015, 11, 12, 13, 14, 0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() }, new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 8),Location = "Zwolle", Comment="Kan laat zijn.", Date = new DateTime(2016,2,11,14,12,0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() }, new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 9),Location="Amsterdam", Comment="Geen speciale opmerking", Date = new DateTime(2015,12,18,15,15,0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() } }; appointments.ForEach(a => context.Appointments.AddOrUpdate(p => p.ID, a)); context.SaveChanges(); employees[0].Appointments.Add(appointments[0]); employees[1].Appointments.Add(appointments[1]); employees[2].Appointments.Add(appointments[2]); context.SaveChanges(); var visitors = new List<Visitor> { new Visitor { FirstName="Sander", LastName="ten Brinke", Email="[email protected]", Company="BelastingDienst", Image = "http://lorempixel.com/400/400", PhoneNumber="0620556193", Appointments = new List<Appointment>() }, new Visitor { FirstName="Reinold", LastName="Boeve", Email= "[email protected]", Company="Harvy", Image= "http://lorempixel.com/400/400", PhoneNumber="0657373660", Appointments= new List<Appointment>() }, new Visitor { FirstName="Eleina", LastName="Nieborg", Email="[email protected]", Company="Windesheim", Image="http://lorempixel.com/400/400", PhoneNumber="0641401035", Appointments = new List<Appointment>() }, new Visitor { FirstName="Roy", LastName="Stobbelaar", Email="[email protected]", Company="BelastingDienst", Image="http://lorempixel.com/400/400", PhoneNumber="0637628563", Appointments = new List<Appointment>() }, new Visitor { FirstName="Michel", LastName="Vaassen", Email="[email protected]", Company="BelastingDienst", Image="http://lorempixel.com/400/400", PhoneNumber="0638572843", Appointments= new List<Appointment>() } }; visitors.ForEach(v => context.Visitors.AddOrUpdate(s => s.Email, v)); context.SaveChanges(); visitors[0].Appointments.Add(appointments[0]); visitors[1].Appointments.Add(appointments[0]); visitors[3].Appointments.Add(appointments[0]); visitors[3].Appointments.Add(appointments[1]); visitors[2].Appointments.Add(appointments[1]); visitors[0].Appointments.Add(appointments[2]); visitors[1].Appointments.Add(appointments[2]); visitors[4].Appointments.Add(appointments[2]); context.SaveChanges(); var collectors = new List<Collector> { new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 1), Employee = employees.FirstOrDefault(x => x.ID == 7), Preference = 1}, //employeeID = signle).id new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 1), Employee = employees.FirstOrDefault(x => x.ID == 8), Preference = 2}, new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 1), Employee = employees.FirstOrDefault(x => x.ID == 9), Preference = 3}, new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 2), Employee = employees.FirstOrDefault(x => x.ID == 8), Preference = 1}, new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 3), Employee = employees.FirstOrDefault(x => x.ID == 9), Preference = 1}, new Collector { Appointment = appointments.FirstOrDefault(x => x.ID == 3), Employee = employees.FirstOrDefault(x => x.ID == 7), Preference = 2}, }; collectors.ForEach(c => context.Collectors.AddOrUpdate(p => p.ID, c)); context.SaveChanges(); appointments[0].Collectors.Add(collectors[0]); appointments[0].Collectors.Add(collectors[1]); appointments[0].Collectors.Add(collectors[2]); appointments[1].Collectors.Add(collectors[3]); appointments[2].Collectors.Add(collectors[4]); appointments[2].Collectors.Add(collectors[5]); context.SaveChanges(); appointments[0].Visitors.Add(visitors[0]); appointments[0].Visitors.Add(visitors[1]); appointments[0].Visitors.Add(visitors[3]); appointments[1].Visitors.Add(visitors[3]); appointments[1].Visitors.Add(visitors[2]); appointments[2].Visitors.Add(visitors[0]); appointments[2].Visitors.Add(visitors[1]); appointments[2].Visitors.Add(visitors[4]); context.SaveChanges(); } } 

Je suis désolé de la quantité de code, mais tout le code qui a conduit à ce problème est là, donc j'espère que quelqu'un pourra m'aider!

S'il vous plaît dites-moi ce que je dois faire pour se débarrasser de ce problème pour toujours. Je serai toujours dans votre dette!

Edition en écriture :

Je parcourais les questions qui pourraient avoir une réponse avant que j'ai posté cette réponse et j'ai trouvé cet article.

Ce qui suit est mentionné:

Ce qui se passe est que vos objects ont tous la valeur int par défaut (0) pour leur key primaire. Lorsque vous les ajoutez au context, EF le détecte et lance une erreur (deux objects du même type ne peuvent pas avoir la même key, dans ce cas, 0. Je suppose que vos champs de key primaire dans la database sont définis comme colonnes IDENTITY incrément automatique +1 sur l'insertion Cela peut sembler étrange, mais vous devez donner à vos objects des identifiants d'espace réservé qui seront remplacés lors de l'insertion avec les valeurs IDENTITY.

J'ai changé ma première partie du code de départ en:

 protected override void Seed(BezoekersDBContext context) { var employees = new List<Employee> { new Employee { ID = 1,FirstName="Jan", LastName="Scholten", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0675876573", SAP_ID= 20149203, Appointments = new List<Appointment>()}, new Employee { ID = 2,FirstName="Bart", LastName="de Vries", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0655544422", SAP_ID=20148394, Appointments = new List<Appointment>()}, new Employee { ID = 3,FirstName="Denke", LastName="Eekhoorn", Email="[email protected]", Image="http://lorempixel.com/400/400", PhoneNumber="0674738383", SAP_ID=2039388, Appointments = new List<Appointment>() } }; employees.ForEach(e => context.Employees.AddOrUpdate(p => p.SAP_ID, e)); context.SaveChanges(); var appointments = new List<Appointment> { new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 7),Location = "Apeldoorn", Comment="Rolstoeltoegang is nodig!", Date = new DateTime(2015, 11, 12, 13, 14, 0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() }, new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 8),Location = "Zwolle", Comment="Kan laat zijn.", Date = new DateTime(2016,2,11,14,12,0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() }, new Appointment { Employee = employees.FirstOrDefault(e => e.ID == 9),Location="Amsterdam", Comment="Geen speciale opmerking", Date = new DateTime(2015,12,18,15,15,0), Visitors = new List<Visitor>(), Collectors = new List<Collector>() } }; //Other code here 

Cela me donne l' erreur suivante:

La séquence contient plus d'un élément

Plus grande partie de la trace de la stack:

 System.InvalidOperationException: Sequence contains more than one element at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__2[TResult](IEnumerable`1 sequence) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate) at System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](DbSet`1 set, IEnumerable`1 identifyingProperties, InternalSet`1 internalSet, TEntity[] entities) at System.Data.Entity.Migrations.DbSetMigrationsExtensions.AddOrUpdate[TEntity](IDbSet`1 set, Expression`1 identifierExpression, TEntity[] entities) at BezoekersRegistratie_BackEnd2.Migrations.Configuration.<>c__DisplayClass1_0.<Seed>b__0(Employee e) in C:\BezoekersRegistratie\Stagiairs\Reinold Boeve\BezoekersRegistratie_BackEnd2\BezoekersRegistratie_BackEnd2\Migrations\Configuration.cs:line 26 at System.Collections.Generic.List`1.ForEach(Action`1 action) at BezoekersRegistratie_BackEnd2.Migrations.Configuration.Seed(BezoekersDBContext context) in C:\BezoekersRegistratie\Stagiairs\Reinold Boeve\BezoekersRegistratie_BackEnd2\BezoekersRegistratie_BackEnd2\Migrations\Configuration.cs:line 26 

J'ai l'printing d'être un peu plus proche. Quelqu'un pourrait-il m'aider et résoudre cela?