0

最初に dotConnect for MySQL でエンティティ フレームワーク コードを使用しています。

context.SaveChanges()オブジェクトをコンテキストに追加した後に呼び出すと、次のエラーが発生します。

DbUpdateException :
エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。

内部例外:
UpdateException: エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。

内部例外: EntityCommandCompilationException: コマンド定義の準備中にエラーが発生しました。詳細については、内部例外を参照してください。"}

内部例外:
NotSupportedException: {"空の挿入ステートメント。"}

DbContextに項目を追加した後に を保存するときDbContext

奇妙な部分は、すべてのコンテンツを追加すると正常に追加されましたが、オブジェクト自体を追加するとこのエラーが発生することです。

このコード行は失敗します:

context.TournamentTables.Add(tournamentTable);

これは完全に機能しますが:

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

                                   });

追加しようとしているオブジェクトは次のとおりです。

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;
            }
        }
    }

トーナメント テーブル ID はデフォルトで 0 であり、ID が「int?」として宣言されている場合は注意してください。それよりもnullになります。私は両方のケースを試し、自分でIDを設定しましたが、それでも失敗します。

4

1 に答える 1

0

間違った方法で列を追加していると思います。

基本的に、これは必要ありません:

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

Entity Framework がそれを行います。context.TournamentTables.Add(tournamentTable)すべての列を tourmentTable に追加した後でのみ呼び出す必要があります。

于 2012-09-29T05:49:06.920 に答える