2017-08-05 8 views
0

私はangularjsプロジェクトでasp.net web apiを開発しています。私のプロジェクトは実際にハイブリッド粒度認証です。私のプロジェクトにはいくつかのテーブルがありますが、挿入に問題が生じるテーブルは3つしかありません。 3つのテーブルは、AspNetRoles、RolePermission、およびRolesです。そして、彼らの関係は次のとおりです。LINQを使用してasp.netの多対多リレーションにデータを挿入できません

enter image description here

役割テーブル内の3つの役割があります。従業員、マネージャー、管理者管理者がロール権限を変更すると、古いロール権限が削除され、新しい権限がAspNetRolesテーブルに挿入されます。ただし、この操作を実行するとエラーが発生します。エラーは次のとおりです。

PRIMARY KEY制約 'PK_dbo.AspNetRoles'に違反しています。オブジェクト 'dbo.AspNetRoles'に重複キーを挿入できません。重複キー値が(dbc1ae5c-a8a7-4aa9-b62e-0948e6e2856c)

マイコードが許可

public void SaveUpdateRolePermission(RoleWisePermission rolePermissionList) 
    { 
     var RoleObject = db.Roles.Where(s => s.Id == rolePermissionList.RoleId).FirstOrDefault(); 

     if (RoleObject.AspNetRoles.Any()) 
     { 
      foreach (var rolePermission in RoleObject.AspNetRoles.ToList()) 
      { 
       RoleObject.AspNetRoles.Remove(rolePermission); 
       db.SaveChanges(); 
      } 
     } 

     foreach (AspNetRoles Role in rolePermissionList.PermissionList.Distinct()) 
     { 
      RoleObject.AspNetRoles.Add(Role); 
     } 


     db.SaveChanges(); 
     db.Dispose(); 

    } public class RoleWisePermission 
{ 
    public List<AspNetRoles> PermissionList { get; set; } 
    public System.Guid RoleId { get; set; } 
} 

を削除し、更新することですされている場合db.saveChanges()の問題が発生します。この問題を解決するのを手伝ってください。

RoleIdに関連するすべてのAspNetRolesを既に削除しました。したがって、アリアイテムを複製する機会はありません。また、ロールパーミッションテーブルにデータがなくても問題が発生していることを忘れないでください。また、rolePermissionList.PermissionListの別個の項目もチェックします。そして、特定のRole IDのRoleオブジェクトからデータを削除し、Trueを返すRole PermissionテーブルにAspNetRolesがあることを確認します。ロールパーミッションテーブルにデータがない場合はどうすれば可能ですか?この問題を解決するのを手伝ってください。

答えて

0

一見したところでは、roleWisePermissionsがコンテキストに関連するエンティティとして認識されない場合が考えられます。エンティティを扱うときは、すべての参照がコンテキストが知っているエンティティに設定されていることを確認することが重要です。 (そのコンテキストからロードされているか、またはそれに接続されています。)コンテキストに未知のエンティティが指定されている場合、デフォルトの動作はそれを挿入しようとすることです。

RoleObjectは現在のDbContextインスタンスからロードされましたが、roleWisePermissionList.AspNetRoles?あなたの例からは、 "db"のスコープと、これらのエンティティ/オブジェクトが配置された場所は明確ではありません。 RoleWisePermissionのクラス宣言は、EntityTypeConfigurationを使用している場合を除いて、エンティティ宣言(キー宣言なし、非仮想コレクション)のようには見えません。

多対多の関係では、一般にコンテキストから適用可能な両方のコレクションをロードし、置換を設定して保存します。私が使用するアプローチはしばしば、エンティティを一度に選択してから、関連でこれらの参照を使用することです。

I.e.

var apsNetRoleIds = roleWisePermission.PermissionsList.Select(x=>x.PermisionId).ToList(); 
var aspNetRoles = db.AspNetRoles.Where(x=> aspNetRoleIds.Contains(x=> x.PermissionId); 

RoleObject.AspNetRoles.AddRange(aspNetRoles); // Assuming List<>, otherwise, iterate and add. 
関連する問題