EF 多对多关系 修改数据

一只小迷糊虫 2017-06-07 03:03:02
有两个对象,User_Info,Role_Info ,多对多的关系

public class User_Info
{
public User_Info()
{
this.RoleInfos = new List<Role_Info>();
}
public int Id { get; set; }
public string UserName { get; set; }
public string UserPwd { get; set; }
public int? RoleId { get; set; }
public bool Status { get; set; }
public List<Role_Info> RoleInfos { get; set; }
}


public class Role_Info
{
public Role_Info()
{
this.UserInfos = new List<User_Info>();
}
public int Id { get; set; }
public string RoleName { get; set; }
public bool Status { get; set; }
public List<User_Info> UserInfos { get; set; }

}



var model= db.User_Info.Where(p => p.Id == Id).FirstOrDefault();
model.UserName = username;
model.UserPwd = userpwd;
model.Status = status;
Role_Info_DAL roleModel = new Role_Info_DAL();
foreach (var item in roles)
{
model.RoleInfos.Add(roleModel.GetModel(Int32.Parse(item.ToString())));
}
var aa = db.SaveChanges();


当我修改user_info 的roles的时候。竟然给rols_info添加了一条数据,并且和User_Info 关联了,我只是想在关系表中添加关系,没想添加一条Role_Info数据,而且list也没有update,是有add,不懂,请教。。
...全文
360 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只小迷糊虫 2017-06-08
  • 打赏
  • 举报
回复
引用 12 楼 u013608482 的回复:
这样还是不行
一只小迷糊虫 2017-06-08
  • 打赏
  • 举报
回复
一只小迷糊虫 2017-06-08
  • 打赏
  • 举报
回复
正怒月神 版主 2017-06-08
  • 打赏
  • 举报
回复
因为你已经attch过了。 所以第二次更新,又会attch,导致这个问题。 查询这个对象的时候, 增加 AsNoTracking()试试 var q=db.User.AsNoTracking().first();
一只小迷糊虫 2017-06-08
  • 打赏
  • 举报
回复
按照网上说的解决 办法都不行,
一只小迷糊虫 2017-06-08
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
[quote=引用 6 楼 u013608482 的回复:]
是不是Selet 就可以了

select 应该不行。[/quote]

又出现问题了,第一次添加可以成功,第二次修改就会报错,
正怒月神 版主 2017-06-07
  • 打赏
  • 举报
回复
引用 6 楼 u013608482 的回复:
是不是Selet 就可以了
select 应该不行。
一只小迷糊虫 2017-06-07
  • 打赏
  • 举报
回复
引用 5 楼 hanjun0612 的回复:
[quote=引用 4 楼 u013608482 的回复:] 没错,最后确实是savechange,不过如果不把role_m放到上下文中(Attach方法),就会被认为是新的对象进行添加。
这个可能是你查询的方式问题。 如果我没记错,下面这样是不需要attch的,因为已经在ef缓存中了。(具体我也是记不清了
Entities db = new Entities();
            var q = db.WD_CompanyInfo.First();      //查询出主键 第一条
            var v = q.WD_Product_Equipment.First(); //外键 第一条
//修改外键第一条的内容
            v.xxxx=....
db.savechange
你可能是直接db.WD_Product_Equipment.first()这样查询的。所以并没有进入ef的跟踪。[/quote] 是不是Selet 就可以了
正怒月神 版主 2017-06-07
  • 打赏
  • 举报
回复
引用 4 楼 u013608482 的回复:
没错,最后确实是savechange,不过如果不把role_m放到上下文中(Attach方法),就会被认为是新的对象进行添加。
这个可能是你查询的方式问题。 如果我没记错,下面这样是不需要attch的,因为已经在ef缓存中了。(具体我也是记不清了
Entities db = new Entities();
            var q = db.WD_CompanyInfo.First();      //查询出主键 第一条
            var v = q.WD_Product_Equipment.First(); //外键 第一条
//修改外键第一条的内容
            v.xxxx=....
db.savechange
你可能是直接db.WD_Product_Equipment.first()这样查询的。所以并没有进入ef的跟踪。
一只小迷糊虫 2017-06-07
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
关联数据,应该先查询出来,然后直接修改这个查询出来的数据。 类似于 var q=db.xxxx.first(); q.xxxx=.... 最后savechange。而不是使用add方法
没错,最后确实是savechange,不过如果不把role_m放到上下文中(Attach方法),就会被认为是新的对象进行添加。

var m = db.User_Info.Where(p => p.Id == Id).FirstOrDefault();
                m.UserName = username;
                m.UserPwd = userpwd;
                m.Status = status;
                Role_Info_DAL roleModel = new Role_Info_DAL();
                List<Role_Info> roleList = new List<Role_Info>();
                foreach (var item in roles)
                {
                    var role_m = roleModel.GetModel(Int32.Parse(item.ToString()));
                    db.Role_Info.Attach(role_m);
                    roleList.Add(role_m);
                }
一只小迷糊虫 2017-06-07
  • 打赏
  • 举报
回复
引用 1 楼 u012881998 的回复:
你的UserInfo类的定义中, public int? RoleId { get; set; } public List<Role_Info> RoleInfos { get; set; } 这两个属性明显是相互矛盾的 一个用户到底属于一个角色,还是可能属于多个角色?
额。。RoleId还没有删除。。不过已经知道怎么回事了
正怒月神 版主 2017-06-07
  • 打赏
  • 举报
回复
关联数据,应该先查询出来,然后直接修改这个查询出来的数据。 类似于 var q=db.xxxx.first(); q.xxxx=.... 最后savechange。而不是使用add方法
西漠以西 2017-06-07
  • 打赏
  • 举报
回复
你的UserInfo类的定义中, public int? RoleId { get; set; } public List<Role_Info> RoleInfos { get; set; } 这两个属性明显是相互矛盾的 一个用户到底属于一个角色,还是可能属于多个角色?

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧