C# 如何在不删除实体的情况下删除EF中多对多表中的记录?

C# 如何在不删除实体的情况下删除EF中多对多表中的记录?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我有两个实体用户和角色 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; } 问题是如何删除RoleUser表中存在的记录并插入新记录,而不删

我有两个实体用户和角色

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; }

问题是如何删除RoleUser表中存在的记录并插入新记录,而不删除实体本身???

您需要这样做才能删除多对多表中的记录。让我知道它是否适合你

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
可以)。
必须包含链接到数据库的对象

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

您需要这样做才能删除多对多表中的记录。让我知道它是否适合你

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
可以)。
必须包含链接到数据库的对象

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

这是删除的代码

_context.Users.find(userId).Roles.Remove(_context.Roles.find(roleId));
_context.SaveChange();
这是add的代码

_context.Users.find(userId).Roles.Add(_context.Roles.find(roleId));
_context.SaveChange();
它将把userid和roleid保存到多对多表中


希望对您有所帮助

这是用于删除的代码

_context.Users.find(userId).Roles.Remove(_context.Roles.find(roleId));
_context.SaveChange();
这是add的代码

_context.Users.find(userId).Roles.Add(_context.Roles.find(roleId));
_context.SaveChange();
它将把userid和roleid保存到多对多表中


希望能帮助您检查数据库模型。如果其中一个外键被删除(此处为用户),则联接表(RoleUser)应处于级联删除状态。然后您只需要删除代码中的用户,数据库就会处理RoleUserASP.NET与实体框架完全无关。NET(和MVC)是web框架,EF是ORM。如果您使用ASP.NET术语查找EF答案,您将无法找到您想要的内容检查您的数据库模型。如果其中一个外键被删除(此处为用户),则联接表(RoleUser)应处于级联删除状态。然后您只需要删除代码中的用户,数据库就会处理RoleUserASP.NET与实体框架完全无关。NET(和MVC)是web框架,EF是ORM。如果您使用ASP.NET术语查找EF答案,您将找不到您想要的答案谢谢,这对我来说很好,但是现在我需要添加新行,您能给我一些提示吗?但是这段代码在角色表中插入新记录。情况是角色在我只想在表中插入它之前就存在了(RoleUser).
必须包含链接到上下文的角色。例如:
\u context.Role.Where(x=>x.Id>5)。我以前做过:
values.Add(_context.Set(Role.Find(id))我将添加_context.SaveChanges();在删除旧行之后,再添加新行之后,否则将在结尾处出现一次??在我做上一条评论之前,它对我不起作用非常感谢,它对我很有效,但是现在我需要添加新行,你能给我提示吗?但是这段代码在角色表中插入新记录。情况是,在我只想将其插入表(RoleUser)之前,角色已经存在。
必须包含链接到上下文的角色。例如:
\u context.Role.Where(x=>x.Id>5)。我以前做过:
values.Add(_context.Set(Role.Find(id))我将添加_context.SaveChanges();在删除旧行之后,再添加新行之后,否则它将在结尾处出现一次??在我做上一个注释之前,它对我来说不起作用