DbContext.Add(...)メソッドを使用して新しいエンティティを追加する際に問題が発生しています。 DbContext.SaveChanges()で、私はDbUpdateConcurrencyExceptionを取得します。私はデータベースに挿入しようとしています。私は、アプリケーション上でローカルホストを実行している唯一の開発者であり、データベーステーブルは初期状態です。ユーザーはいません。俺だけ。それは似ていますが、DbUpdateConcurrencyException追加時
これは、助けにはならなかった:
Entity Framework 6 DbUpdateConcurrencyException When Adding New Rows To Database
私がリクエストごとに1 DbContextを使用しています。このように:
https://stackoverflow.com/a/20751723/2088914
はここ(移行して、最初のコード)のモデルです:
One DbContext per request in ASP.NET MVC (without IOC container)
私はこのようなエンティティフレームワークによって生成されたSQL文をログアウトしています。私が投稿するとき、私はアソシエイト、ロール、割り当て、および削除されたフラグのみを提供します。
public class Permission {
[Column("row_id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RowId { get; set; }
[Key]
[StringLength(10)]
[Column("associate_nt_id", Order = 0)]
[Required]
public string AssociateNtId { get; set; }
[Key]
[Column("role_name", Order = 1)]
[StringLength(50)]
[Required]
public string RoleName { get; set; }
[Key]
[Column("eff_ts", Order = 2)]
[Required]
public DateTime EffectiveTimestamp { get; set; }
[StringLength(10)]
[Column("assignor_nt_id")]
[Required]
public string RoleAssignorNtId { get; set; }
[Column("deleted")]
[Required]
public bool Deleted { get; set; }
}
私が持っている:すべての期待ものを - 私は、サーバーに移入され、私はクライアントからそれを提供しない、日付が同様にデフォルト値であるため、行IDは自動的に0に設定されています成功した角度スパによってアクセスされ、モデルが読み込まれますpostメソッドとウェブAPIコントローラ:
:私はVisual Studioでのデバッグで実行
[HttpPost]
[Route("")]
[Require(Roles.admin)]
public Permission Post(Permission permission) {
permission.EffectiveTimestamp = DateTime.Now;
MAPDB.Current.Permissions.Add(permission);
MAPDB.Current.Database.Log = s => {
Debug.WriteLine(s);
};
MAPDB.Current.SaveChanges();
return permission;
}
2015年には、ここでエラーメッセージがありますここ は、エンティティフレームワークが生成されるSQLです:
INSERT [dbo].[_permissions]([associate_nt_id], [role_name], [eff_ts], [assignor_nt_id], [deleted])
VALUES (@0, @1, @2, @3, @4)
SELECT [row_id]
FROM [dbo].[_permissions]
WHERE @@ROWCOUNT > 0 AND [associate_nt_id] = @0 AND [role_name] = @1 AND [eff_ts] = @2
-- @0: 'associate' (Type = String, Size = 10)
-- @1: 'user' (Type = String, Size = 50)
-- @2: '9/20/2017 12:49:05 PM' (Type = DateTime2)
-- @3: 'assignor' (Type = String, Size = 10)
-- @4: 'True' (Type = Boolean)
-- Executing at 9/20/2017 12:49:05 PM -05:00
-- Completed in 24 ms with result: SqlDataReade
-- Closed connection at 9/20/2017 12:49:05 PM -05:00
ロガーで実行しているようだ、と何のデータベースの挿入が発生しないことを除い文は、私が期待する正確に何です。文をロガーから取り出し、パラメータを入力してsqlクライアント経由で実行すると、動作し、作成された行IDを返します。私は問題が何かを理解していません - 並行処理の状況はありません。カラムが見つからない/追加されてはいけません。無効なパラメータもなく、オブジェクトプロパティへのカラムのマッピングも問題ありません。キー違反もなく、 。
例外を飲み込むことなく、この新しいオブジェクトを挿入するだけで、どのようにエンティティフレームワークを取得できますか?
ありがとうございました。
:あなたは、データベースの列の型を変更することを検討可能性がある、(私が期待したように)それがはたらく場合
:
は、その場合は、あなたが時間値をトリミングしてみてください確認するには'RowId'をプライマリキーとしてマークすることもできますが、現在キーとして使用している3つのフィールドのプライマリクラスターインデックスを作成することができます。生成された移行スクリプトも手動で変更する必要があります。 – Igor@Igorこれは参考になる提案でした。私は今のところ以下のように動作するようになっていますが、あなたの言うことをすれば、私はおそらく両方を行う必要があります:列の種類を変更し、インデックスとキーを切り替えます。ありがとうございました。 –