2

これらは私の単純化されたエンティティです:

public class User : Entity
{
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role : Entity
{
    public virtual ICollection<User> Users { get; set; }
}

var user = dbContext.Set<User>().Find(id);
dbContext.Set<User>().Remove(user);
dbContext.SaveChanges(); // here i get error (can't delete because it's the     
//referenced by  join table roleUsers

問題は、結合テーブルがユーザーテーブルを参照し、efがユーザーを削除する前に結合テーブルからレコードを削除しないことです。

テストケースを書いてみたところ、次のことに気づきました。

同じコンテキストを使用してロールを持つユーザーを追加し、変更を保存し、変更を削除して再度保存すると、機能します

しかし、挿入用と削除用の2つの異なるコンテキストを使用すると、このエラーが発生します

4

3 に答える 3

2

ユーザーを削除する前に、まずロールコレクションをクリアする必要があります(ユーザーのロールをロードする必要があります)。

于 2011-02-22T13:07:52.023 に答える
1

この削除だけを取得したい場合は、エラーが言っていることを実行してください。

DELETEメソッドの一部として、これを順番に実行する必要があります。

1)User.Include(r => r.roles)を使用できる関連ロールを含むユーザーを取得します

2)指定されたユーザーのロールを繰り返して削除します(このループを実行するときは、必ずtoList()を使用してください)。

3)ユーザーを削除します

4)savechanges

于 2011-10-31T02:32:13.563 に答える
0
user.Roles
    .ToList()
    .ForEach(role => user.Roles.remove(role));

context.Users.remove(user);
context.SaveChanges();
于 2014-11-05T11:16:18.297 に答える