代码之家  ›  专栏  ›  技术社区  ›  Jon Wisniewski

接收500个内部服务器错误,即使我从LINQ接收数据

  •  1
  • Jon Wisniewski  · 技术社区  · 8 年前

    堆栈溢出。

    我今天遇到的问题是,当我向本地主机发送get请求时:xxxxx试图通过ID获取单个食物项目,我收到一个500内部服务器错误。

    我不明白的是,我在调试时检查了代码,它显示它从我的数据库中找到了它需要的所有信息,但当它以“OK(food)”的形式发送时,我收到了500个内部服务错误,即使它有信息。

    我对web api还很陌生,所以希望您能给我一些解释。我正在使用Visual Studio 2015、实体框架6和SQL Management Server DB。

    我很抱歉发布链接,它说我需要10个声誉才能发布图片

    protected void Page_Load(object sender, EventArgs e)
        {
                HttpClient client = new HttpClient();
                client.BaseAddress = new Uri("http://localhost:63591/");
                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = client.GetAsync("api/foods/" + Request.QueryString["ID"]).Result;
    
                if (response.IsSuccessStatusCode)
                {
                    string foodstring = response.Content.ReadAsStringAsync().Result;
                    Food editFood = JsonConvert.DeserializeObject<Food>(foodstring);
                    EditFoodName.Text = editFood.FoodName;
                    EditCalories.Text = editFood.Calories.ToString();
                    EditNotes.Text = editFood.Notes;
                }
        }
    
        [ResponseType(typeof(Food))]
        public IHttpActionResult GetFood(int id)
        {
            Food food = db.Foods.Find(id);
            if (food == null)
            {
                return NotFound();
            }
    
            return Ok(food);
        }
    
    
    
    public partial class Food
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Food()
        {
            this.MealFoods = new HashSet<MealFood>();
        }
    
        public int FoodID { get; set; }
        public string FoodName { get; set; }
        public int Calories { get; set; }
        public string Notes { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<MealFood> MealFoods { get; set; }
    }
    

    https://i.imgur.com/8h6EaZM.png

    https://i.imgur.com/YkD8Ijp.png

    2 回复  |  直到 8 年前
        1
  •  1
  •   RMH    8 年前

    在行动中 GetFood 您指定返回类型为 Food . 默认情况下,EntityFramework围绕实体生成代理对象,以便延迟加载。

    这意味着该行:

     Food food = db.Foods.Find(id);
    

    不会返回 食物 对象,但它是食物的动态子类。这也可以在您在注释中发布的错误中看到,该错误表示该操作不需要类型 Food_31C9E7DC... 待退回。


    有三种方法可以解决此问题:

    • 只需在EntityContext中禁用代理生成,
    • 删除实体上的虚拟属性(延迟加载属性)(如果不需要,EF将跳过代理生成),
    • 将EntityObject映射到DataContract对象并返回它。

    See here for more info on proxies.

        2
  •  0
  •   Jailson Evora    8 年前

    而是直接使用db。但是,最好创建自己的公共对象并使用Linq管理查询,或者如果坚持直接使用EntityFramework创建的对象,则必须禁用延迟加载和代理生成。 使用您自己的实现,方法应如下所示:

    [ResponseType(typeof(PseudoFood))]
    public IHttpActionResult GetFood(int id)
    {
        //Food food = db.Foods.Find(id);
        PseudoFood food = (from a in db.Foods
                           where a.FoodID == id
                           select new PseudoFood()
                           {
                               FoodName = a.FoodName,
                               FoodID = a.FoodID,
                               Calories = a.Calories,
                               Notes = a.Notes
                           }).FirstOrDefault();
    
        if (food == null)
        {
            return NotFound();
        }
    
        return Ok(food);
    }
    

    注意[ResponseType(typeof(PseudoFood))],使用PseudoFood代替Food。

    推荐文章