Web Api&实体框架:如何使用复杂的模型对象执行crud操作

时间:2014-06-18 10:23:34

标签: 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 { get; set; }

   public virtual User User{ get; set; }
}

用户可以拥有多个项目,但项目只有一个用户。 现在在asp web api中,我创建了一个用户和一个带有POST请求的项目:例如,对于用户,我有使用此方法的UsersController:

public IHttpActionResult PostUser(User user)
{
   if (!ModelState.IsValid)
   {
      return BadRequest(ModelState);
   }

   db.Users.Add(user);
   db.SaveChanges();

   return CreatedAtRoute("DefaultApi", new { id = user.Id }, user);
}

现在如果我想更新创建的用户,为他分配创建的项目,我该如何实现呢?我必须在UsersController上调用PUT方法吗?什么是请求主体json对象?

由于

3 个答案:

答案 0 :(得分:2)

ASP.NET MVC通常会将对象发送到操作并更新这样的实体:

public IHttpActionResult Edit(User user)
{
   try
   {
      if (ModelState.IsValid)
      {
         db.Entry(user).State = EntityState.Modified;
         db.SaveChanges();
      }
   }
   catch (Exception e)
   {

   }
}

但是如果你有一个复杂的对象,它包含某种存储在DB中的另一个复杂对象的列表,Entity Framework会将EntityState.Modified设置为所有实体图形和项目,存储在列表中将再次保存。

因此,在我的实践中,我发送的对象没有包含列表,更新操作如下所示:

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)
       {

       }
    }

答案 1 :(得分:0)

我相信你会触及更常见的问题,即如何在断开连接的场景中使用Entity Framework(n层架构)。在这种情况下的基本问题是你失去了EF的好功能,即自动更改跟踪。因此,你必须自己实现它。实际上,这意味着在执行SaveChanges()方法之前,必须为图中的每个对象设置适当的EntityState。

您可以找到一些涵盖此主题的文章和讨论,它们可以帮助您设计体系结构。 e.g:

http://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework/

我的经验是基于EF 4,但我看到上面的链接,我认为EF仍然在这方面受到影响:

http://entityframework.codeplex.com/workitem/864

答案 2 :(得分:0)

您可能有兴趣使用在服务器端使用Entity Framework的开源N-Tier Entity Framework并生成整个基础架构,用于构建基于WCF的n层架构,包括客户端的类似EF的API 。但是,此框架要求您的客户端使用WCF而不是WebAPI。