C# webapi&;实体框架:如何对复杂模型对象执行crud操作
假设在实体框架中,我有以下模型:C# webapi&;实体框架:如何对复杂模型对象执行crud操作,c#,asp.net,.net,asp.net-mvc,entity-framework,C#,Asp.net,.net,Asp.net Mvc,Entity Framework,假设在实体框架中,我有以下模型: public class User { public int UserId { get; set; } public string Name { get; set; } public virtual ICollection<Item> Items { get; set; } } public class Item { public int ItemId { get; set; } public string Name
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
public int ItemId { get; set; }
public string Name { get; set; }
public virtual User User{ get; set; }
}
现在,如果我想更新创建的用户,将创建的项目分配给他,我该如何实现它?我必须调用UsersController上的PUT方法,对吗?请求主体json对象是什么
谢谢ASP.NET MVC通常会发送一个对象到action并更新如下实体:
public IHttpActionResult Edit(User user)
{
try
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception e)
{
}
}
但如果您有一个复杂对象,其中包含存储在DB中的另一个复杂对象的某种列表,Entity Framework将设置EntityState。修改为所有实体图形和项目后,存储在列表中的将再次保存
因此,在我的实践中,我发送一个没有包含列表的对象,更新操作如下所示:
public IHttpActionResult Edit(User user)
{
try
{
User original = db.FirstOrDefault(u=>u.Id==user.Id);
original.Name = user.Name;
if (ModelState.IsValid)
{
db.Entry(original).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception e)
{
}
}
我相信你们提到了更普遍的问题,即如何在断开连接的场景(n层体系结构)中使用实体框架。这种情况下的基本问题是,您失去了EF的良好特性,即自动更改跟踪。因此,您必须自己实施它。实际上,这意味着在执行SaveChanges()方法之前,必须为图形中的每个对象设置适当的EntityState 您可以找到几篇关于这个主题的文章和讨论,它们可以帮助您设计您的体系结构。e、 g: 我的经验是基于EF 4,但我看了上面的链接,我认为EF在这方面仍然受到影响:
您可能对使用开放源码感兴趣,它在服务器端使用实体框架,并生成整个基础架构,用于构建基于WCF的n层体系结构,包括客户端类似EF的API。但是,此框架要求您的客户端使用WCF而不是WebAPI。好的,但是如果我想为用户分配一个项目?我可以调用用户控制器上的编辑方法吗?您可以检查传递的对象中是否有项
if(user.items)original.items=user.items
public IHttpActionResult Edit(User user)
{
try
{
User original = db.FirstOrDefault(u=>u.Id==user.Id);
original.Name = user.Name;
if (ModelState.IsValid)
{
db.Entry(original).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception e)
{
}
}