0

J'utilise d'abord le code de structure d'entité avec dotConnect for MySQL.Entity Framework "Instruction d'insertion vide"

je reçois l'erreur suivante quand je l'appelle context.SaveChanges() après avoir ajouté un objet au contexte:

DbUpdateException:
Une erreur est survenue lors de l'actualisation des entrées. Voir l'exception interne pour plus de détails.

Exception interne:
UpdateException: une erreur s'est produite lors de la mise à jour des entrées. Voir l'exception interne pour plus de détails.

Exception interne: EntityCommandCompilationException: une erreur s'est produite lors de la préparation de la définition de la commande. Voir l'exception interne pour plus de détails "}

Exception interne:
NotSupportedException: {".. Instruction d'insertion vide "}

lors de l'enregistrement du DbContext après avoir ajouté un élément à la DbContext

La partie bizarre est que quand j'ajoute tout son contenu est ajouté avec succès, mais quand j'ajoute l'objet lui-même j'obtiens cette erreur

Cette ligne de code échoue:

context.TournamentTables.Add(tournamentTable); 

Alors que celui-ci fonctionne parfaitement:

tournamentTable.Columns.ForEach(column => 
            { 
             column.Cells.ForEach((cell) => context.TournamentCells.Add(cell)); 
             context.TournamentColumns.Add(column); 

            }); 

Voici l'objet que j'essaie d'ajouter:

public class TournamentTable //: IEnumerable<TournamentColumn> 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int? Id { get; set; } 

     public List<TournamentColumn> Columns { get; set; } 

     public TournamentTable() 
     { 
      Columns = new List<TournamentColumn>(); 
     } 

     public void AddColumn(int index, TournamentColumn column) 
     { 
      Columns.Insert(index, column); 
     } 

     public void RemoveColumn(int index) 
     { 
      Columns.RemoveAt(index); 
     } 

     /// <summary> 
     /// Add a tournament cell at the top of the column. 
     /// </summary> 
     /// <param name="column"></param> 
     public void AddColumn(TournamentColumn column) 
     { 
      Columns.Add(column); 
     } 

     /// <summary> 
     /// Returns the tournament column at the index specified. 
     /// </summary> 
     /// <param name="index"></param> 
     /// <returns></returns> 
     [NotMapped] 
     public TournamentColumn this[int index] 
     { 
      get { return Columns[index]; } 
     } 

     /// <summary> 
     /// Returns the tournament cell at the index specified. 
     /// </summary> 
     /// <param name="columnIndex"></param> 
     /// <param name="cellIndex"></param> 
     /// <returns></returns> 
     [NotMapped] 
     public TournamentCell this[int columnIndex, int cellIndex] 
     { 
      get { return Columns[columnIndex][cellIndex]; } 
      set 
      { 

       Columns[columnIndex][cellIndex] = value; 
      } 
     } 
    } 

Notez que le tableau du tournoi Id est 0 par défaut, et si l'Id est déclaré comme "int?" Que ce sera null. J'ai essayé les deux cas et également mis l'identification par moi-même et il échoue toujours.

Répondre

0

Je pense que vous ajoutez les colonnes de la mauvaise façon.

Fondamentalement, vous n'avez pas besoin ceci:

tournamentTable.Columns.ForEach(column => 
{ 
    column.Cells.ForEach((cell) => context.TournamentCells.Add(cell)); 
    context.TournamentColumns.Add(column); 
}); 

Entity Framework fait pour vous. Vous n'avez qu'à appeler le context.TournamentTables.Add(tournamentTable) après avoir ajouté toutes les colonnes au tournoiTable.