entity-framework - 无法保存多对多关系

标签 entity-framework save

我有以下表格/ View

Users (View)
-> UserId
-> Name

Roles (Table)
-> RoleId
-> Name

UserRoles (Table)
-> UserId
-> RoleId

和类

public class Role{
     public int RoleId{get;set}
     public string Name{get;set}
}

public class User{
     public int UserId{get;set}
     public string Name{get;set}
     public ICollection<Role> Roles{get;set}
}

以及保存方法

using (var helper = new DbContext())
{
     helper.Users.Attach(user);
     helper.SaveChanges();
}

如上所示,Users 是一个 View ,UserRoles 是一个映射表。我能够检索用户实体以及映射的角色。但是在保存时它不会抛出任何异常,也不会保存。我尝试使用探查器检查数据库,但它甚至没有命中数据库。

由于用户是一个 View ,我不想保存用户实体,而只想保存在角色集合中所做的更改。

最佳答案

这无法挽救任何东西。 Attach 将整个对象图放入上下文中,但处于状态Unchanged。如果上下文中的所有对象均未更改,SaveChanges 将不会向数据库发出任何命令(因为对于 EF 而言,没有任何更改)。

如果您想要进行 EF 识别的更改,您必须首先附加代表数据库中状态的对象,然后进行更改,例如:

using (var helper = new DbContext())
{
    helper.Users.Attach(user);
    helper.Roles.Attach(myNewRole);
    user.Name = myNewName;
    user.Roles.Add(myNewRole);
    // etc.
    helper.SaveChanges();
}

或者,您可以将用户标记为已修改:

helper.Entry(user).State = EntityState.Modified;

但我相信这只会影响实体的标量属性,并不能解决向用户添加新角色的问题。

关于entity-framework - 无法保存多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386014/

相关文章:

c# - Nest 无法使用 EF6/MVC5 处理大型数据库模型

.net - Entity Framework 和多对多查询无法使用?

java - 在android中加载和保存数据文件

delphi - 将对象列表保存在文本文件中

JavaScript 下载链接

c# - 在 EF Core 中指定 Azure SQL Server 版本而不破坏本地开发

c# - UWP 和 WPF 数据库入门 : Roadmap needed

entity-framework - 如何更改EntityFramework中自动生成的 "Discriminator"列?

将单张幻灯片另存为 .ppt 的 VBA 代码

scikit-learn - 将 xgboost.Booster 的实例转换为实现 scikit-learn API 的模型