EF一对多,这样修改数据为什么不行呢?

货郎大叔 2020-01-13 05:13:36

public class Product //商品
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
public int CategoryId { get; set; }
}
public class Category //分类
{
public Category()
{
products = new HashSet<Product>();
}
public int Id { get; set; }
public string Name { get; set; }
//导航属性
public ICollection<Product> products { get; set; }
}


using (var context = new KTStoreModel())
{
Category category = context.Categories.FirstOrDefault();
category.products = new List<Product>()
{
new Product(){Name = "高中英语",Price = 34},
new Product(){Name = "高中历史",Price = 25 }
};
context.SaveChanges();
}

分类和商品,一对多关系,上面的代码先找出一条分类数据, 然后修改其products属性值,结果出异常:System.InvalidOperationException:“操作失败:无法更改关系,因为一个或多个外键属性不可为空。对关系进行更改时,相关外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。”

这是为什么呢?
...全文
328 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
极客诗人 2020-01-14
  • 打赏
  • 举报
回复
state 也要改吧。。
正怒月神 2020-01-14
  • 打赏
  • 举报
回复
引用 2 楼 货郎大叔 的回复:
[quote=引用 1 楼 正怒月神 的回复:] 你用 category.products.add() 这样呢? 我记得,只要你获取了,那么ef就会存在目标跟踪。 因此不能替换对象的引用。
关键是,我不仅要Add,数据库中的旧的还要替换啊[/quote] 你自己判断,新增的是add 修改的是查询后,直接修改。 最后一期saveChange()
货郎大叔 2020-01-13
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
你用 category.products.add() 这样呢? 我记得,只要你获取了,那么ef就会存在目标跟踪。 因此不能替换对象的引用。
关键是,我不仅要Add,数据库中的旧的还要替换啊
正怒月神 2020-01-13
  • 打赏
  • 举报
回复
你用 category.products.add() 这样呢? 我记得,只要你获取了,那么ef就会存在目标跟踪。 因此不能替换对象的引用。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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