2017-03-08 12 views
0

は、私は2人のエンティティのユーザーとロールエンティティを削除せずにEFのMany to Manyテーブルのレコードを削除するにはどうすればいいですか?

public partial class User 
{ 
public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 

}

public partial class Role 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; }  
    public virtual ICollection<User> Users { get; set; } 
} 

を持っていると私は、データベース内のテーブル(RoleUser)を持っている唯一のユーザーIDおよびロールIDが含まれています。 ユーザーを変更するには、RoleUserテーブルに存在する行を削除して新しいレコードを挿入します。

public void Update(User usr) 
    { 
     var existingParent = _context.Users 
      .Where(p => p.Id == usr.Id) 
      .Include(p => p.Roles) 
      .SingleOrDefault(); 

     if (existingParent != null) 
     { 
      // Update parent 
      _context.Entry(existingParent).CurrentValues.SetValues(usr); 

      // Delete children 
      foreach (var existingChild in existingParent.Roles.ToList()) 
      { 
       if (!usr.Roles.Any(c => c.Id == existingChild.Id)) 
        _context.Roles.Remove(existingChild); 
      } 
      } 
     } 

を私はこの次のコードを使用する場合 それはRoleUser表の行を削除しても、役割自体

質問はRoleUser表に存在するレコードを削除し、エンティティ自体を削除せずに新しいレコードを挿入する方法です??

+0

データベースモデルをチェックしてください。外部キーの1つが削除された場合(ここではUser)、結合テーブル(RoleUser)がカスケード削除されている必要があります。次に、コード内のUserを削除するだけで、データベースはRoleUser – Mats391

+0

を処理します。ASP.NETはEntity Frameworkと完全に無関係です。 ASP.NET(およびMVC)はWebフレームワークであり、EFはORMです。あなたはASP.NET用語を使ってEFの答えを探すなら、あなたが望むものを見つけられないでしょう –

答えて

1

多対多表のレコードのみを削除するには、これを行う必要があります。それがあなたのために働くかどうか私に教えてください。

IObjectContextAdapter contextAdapter = (IObjectContextAdapter)_context; 
ObjectStateManager stateManager = contextAdapter.ObjectContext.ObjectStateManager; 

stateManager.ChangeRelationshipState(existingParent, existingChild, "Roles", EntityState.Deleted); 

_context.SaveChanges(); 

新しい値を追加するには:

_context.Entry(existingParent).Collection("Roles").CurrentValue = values; 

valuesは(IEnumerableまたはICollectionも、そうList<Role>がOKである必要があります)を追加するデータのリストです。 valuesには、データベースにリンクされたオブジェクトが含まれている必要があります。

foreach (Role entry in newValues) { 
    values.Add(_context.Set(typeof(Role)).Find(entry.Id)); 
} 
+0

ありがとう、それは私とうまくいったけど、今は新しい行を追加する必要があります。そのために私にヒントを教えてください。 –

+0

あなたは、再歓迎します。私はパートを追加して私の答えを更新しました。 – erikscandola

+0

しかし、このコードはロールテーブルに新しいレコードを挿入します。ロール(roleUser)だけを挿入する前にロールが存在します。 –

0

これがremove

_context.Users.find(userId).Roles.Remove(_context.Roles.find(roleId)); 
_context.SaveChange(); 

ためのコードであり、これはこれは、多対多の

ホープ・テーブルにユーザーIDとroleidを保存します

_context.Users.find(userId).Roles.Add(_context.Roles.find(roleId)); 
_context.SaveChange(); 

を追加するためのコードですヘルプ

関連する問題