asp.net-mvc – 在EF CF中添加/更新导航属性
发布时间:2020-12-16 06:24:34 所属栏目:asp.Net 来源:网络整理
导读:我知道这已经在SO上被多次询问了,但我找不到关于如何在EF CF中添加或更新导航属性的明确答案. 实体(简化): public class Basket : EntityBase { public virtual ListFruit TaggedFruits { get; set; } } public class Fruit : EntityBase { } 的ActionResul
我知道这已经在SO上被多次询问了,但我找不到关于如何在EF CF中添加或更新导航属性的明确答案.
实体(简化): public class Basket : EntityBase { public virtual List<Fruit> TaggedFruits { get; set; } } public class Fruit : EntityBase { } 的ActionResult: [HttpPost] public ActionResult SaveTags(Basket basket,int[] selectedFruits) { basket.TaggedFruits = new List<Fruits>(); foreach (int guid in selectedFruits) basket.TaggedFruits.Add(repository.Fruits.FirstOrDefault(p => p.Id == guid)); using (var context = new EFDbContext()) { context.Baskets.Attach(basket); context.SaveChanges(); } return RedirectToAction("GetBasket",new {guid = basket.Guid}); } 我已经尝试了上面的SaveTags方法的多次迭代,但从来没有让它工作.这一个抛出: IEntityChangeTracker的多个实例不能引用实体对象. 在研究了这里和其他站点之后,错误显然表明在方法中混合我的存储库模式和DBContext会导致冲突. 如果我使用以下方法将标记移动到存储库: [HttpPost] public ActionResult SaveTags(Basket basket,int[] selectedFruits) { List<Fruit> taggedFruits = new List<Fruit>(); foreach (int guid in selectedFruits) taggedFruits.Add(new Fruit {Id = guid}); libraryRepository.TagBasket(basket,taggedFruits); return RedirectToAction("GetBasket",new {guid = basket.Guid}); } /*in repository*/ public void TagBasket(Basket basket,List<Fruit> fruits ) { basket.Taggedfruits = new List<Fruit>(); foreach (var fruit in fruits) { basket.Taggedfruits.Add(Fruit); } context.Baskets.Attach(basket); context.SaveChanges(); } 然后,不会对数据库进行任何更改.什么都没发生.有人能指出我正确的方向吗?我一直在争取这么长时间,谢谢…… 解决方法
好吧,您只是将实体(=设置状态)附加到Unchanged,然后调用SaveChanges.在这种情况下,你告诉EF没有任何改变 – >什么都没发生.
要更改Basket和TaggedFruits之间的关系,您必须从数据库中加载篮子的原始水果集合,然后根据您的Id集合中的ID从中删除或添加标签水果来自/加载到篮子的水果集合中: public void TagBasket(Basket basket,List<Fruit> fruits) { var basketInDB = context.Baskets.Include(b => b.Taggedfruits) .Single(b => b.Id == basket.Id); foreach (var fruitInDB in basketInDB.Taggedfruits.ToList()) if (!fruits.Any(f => f.Id == fruitInDB.Id)) basketInDB.Taggedfruits.Remove(fruitInDB); foreach (var fruit in fruits) if (!basketInDB.Taggedfruits.Any(f => f.Id == fruit.Id)) { var newFruit = new Fruit { Id = fruit.Id }; context.Fruits.Attach(newFruit); basketInDB.TaggedFruits.Add(newFruit); } // Next line is only necessary if other properties in basket // could have been changed in your view context.Entry(basketInDB).CurrentValues.SetValues(basket); context.SaveChanges(); } 您也可以将int [] selectedFruits集合传入此方法,因为只需要id. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ASP.NET Core jquery Autocomplete返回列表中的空白行
- asp.net – Internet Explorer 8 – 据报道该网站不安全
- asp.net-mvc – System.Data.SqlClient.SqlException:无效
- asp.net-mvc – ASP.Net MVC:发送JSON到控制器
- .net – 编辑器模板不适用于DisplayFormat
- asp.net-core – ASPNetCore – 通过REST上传文件
- asp.net-mvc – 在ASP.NET MVC中,在使用正确的类型化对象呈
- asp.net – 如何连接RDLC表达式中的值?
- asp.net – JSON字符串中的反斜杠
- .Net人的源代码控制
推荐文章
站长推荐
- asp.net-mvc – 在Hub,SignalR之外获取connectio
- asp.net-mvc – 将ViewData传递给RenderPartial
- 我想学习ASP.Net 2.0 / 3.5 / 4.0我应该从ASP.Ne
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ex
- 从asp.net中的代码编写Html标记
- asp.net-mvc – 如何单元测试应用了[Authorize]属
- asp.net – Response.Redirect(“SomeURL”,fals
- asp.net-mvc – 如何在ASP.net MVC中正确测试具有
- entity-framework-6 – Entity Framework种子方法
- asp.net – 避免使用CORS进行预检OPTIONS请求
热点阅读