1

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コントローラ:
enter image description here
:私は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を返します。私は問題が何かを理解していません - 並行処理の状況はありません。カラムが見つからない/追加されてはいけません。無効なパラメータもなく、オブジェクトプロパティへのカラムのマッピングも問題ありません。キー違反もなく、 。

例外を飲み込むことなく、この新しいオブジェクトを挿入するだけで、どのようにエンティティフレームワークを取得できますか?

ありがとうございました。

+1

:あなたは、データベースの列の型を変更することを検討可能性がある、(私が期待したように)それがはたらく場合

// ... var time = DateTime.Now; permission.EffectiveTimestamp = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second); // ... 

は、その場合は、あなたが時間値をトリミングしてみてください確認するには'RowId'をプライマリキーとしてマークすることもできますが、現在キーとして使用している3つのフィールドのプライマリクラスターインデックスを作成することができます。生成された移行スクリプトも手動で変更する必要があります。 – Igor

+0

@Igorこれは参考になる提案でした。私は今のところ以下のように動作するようになっていますが、あなたの言うことをすれば、私はおそらく両方を行う必要があります:列の種類を変更し、インデックスとキーを切り替えます。ありがとうございました。 –

答えて

2

多くの場合、問題は、DateTimeのPK(EffectiveTimestamp)の部分によって発生している可能性があります。レコードは挿入されますが、デフォルトではDateTimeのプロパティはdatetimeのカラムにマップされていますが、ログからわかるように、パラメータタイプはdatetime2であるため、精度が高く、切り捨てられるため、SELECTが見つかりません表の列に格納されたときには、選択フィルタの[eff_ts] = @2部分と一致しません。

[Key] 
[Column("eff_ts", Order = 2, TypeName="datetime2")] 
[Required] 
public DateTime EffectiveTimestamp { get; set; } 
+0

はい、これはうまくいきました。具体的には、 'TypeName =" datetime2 "'に対してあなたが言ったことを行い、それが終わったら 'DateTime.Now'切り捨ても削除しました。どうもありがとうございます。 –

関連する問題