Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# webapi&;实体框架:如何对复杂模型对象执行crud操作_C#_Asp.net_.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

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

       }
    }