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请求
热点阅读
