ไม่สามารถจัดลำดับการตอบสนองใน Web API ด้วย Json


109

ฉันกำลังทำงานกับ ASP.NET MVC 5 Web Api ฉันต้องการปรึกษาผู้ใช้ของฉันทั้งหมด

ฉันเขียนapi/usersและได้รับสิ่งนี้:

"ประเภท" ObjectContent "1" ล้มเหลวในการจัดลำดับเนื้อหาการตอบสนองสำหรับประเภทเนื้อหา "application / json; charset = utf-8" "

ใน WebApiConfig ฉันได้เพิ่มบรรทัดเหล่านี้แล้ว:

HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

แต่มันยังไม่ได้ผล

ฟังก์ชันของฉันในการส่งคืนข้อมูลคือ:

public IEnumerable<User> GetAll()
{
    using (Database db = new Database())
    {
        return db.Users.ToList();
    }
}

ออบเจ็กต์มูลค่ามีลักษณะอย่างไรที่คุณพยายามส่งต่อไปยังผู้บริโภค
mckeejm

ขอบคุณมาก! เพียงแค่ fyi - ฉันคิดว่าควรอ่าน: โดยใช้ (Database db = new Database ()) {List <UserModel> listOfUsers = new List <UserModel> (); foreach (ผู้ใช้ var ใน db.Users) {UserModel userModel = UserModel ใหม่ (); userModel.FirstName = user.FirstName; userModel.LastName = user.LastName; listOfUsers.Add (userModel); } ผู้ใช้ <UserModel> IEnumerable = listOfUsers; กลับผู้ใช้; } .. เนื่องจากผลลัพธ์ทั้งหมดคืนค่าเหมือนกัน
Jared Whittington

คำตอบ:


76

เมื่อพูดถึงการส่งคืนข้อมูลกลับไปยังผู้บริโภคจาก Web Api (หรือบริการเว็บอื่น ๆ สำหรับเรื่องนั้น) ฉันขอแนะนำอย่างยิ่งว่าอย่าส่งคืนเอนทิตีที่มาจากฐานข้อมูล การใช้แบบจำลองมีความน่าเชื่อถือและดูแลรักษาได้มากกว่าซึ่งคุณสามารถควบคุมลักษณะของข้อมูลได้ไม่ใช่ฐานข้อมูล ด้วยวิธีนี้คุณจะไม่ต้องวุ่นวายกับฟอร์แมตมากนักใน WebApiConfig คุณสามารถสร้าง UserModel ที่มีโมเดลลูกเป็นคุณสมบัติและกำจัดลูปอ้างอิงในอ็อบเจ็กต์ส่งคืน นั่นทำให้ serializer มีความสุขมากขึ้น

นอกจากนี้ไม่จำเป็นต้องลบฟอร์แมตหรือประเภทสื่อที่รองรับโดยทั่วไปหากคุณเพียงระบุส่วนหัว "ยอมรับ" ในคำขอ บางครั้งการเล่นกับสิ่งนั้นอาจทำให้สิ่งต่างๆสับสนมากขึ้น

ตัวอย่าง:

public class UserModel {
    public string Name {get;set;}
    public string Age {get;set;}
    // Other properties here that do not reference another UserModel class.
}

เมื่อคุณอ้างถึงโมเดลคุณต้องการบอกว่าฉันกำลังทำอะไรอยู่? ส่งคืน IEnumerable ของผู้ใช้ที่เป็น Model
CampDev

5
คุณกำลังส่งคืนเอนทิตี เอนทิตีอ้างถึงออบเจ็กต์ในฐานข้อมูลที่สามารถเรียกใช้โดย id เฉพาะ คุณกำลังส่งคืนเอนทิตีผู้ใช้ทั้งหมดจากฐานข้อมูลของคุณ ฉันขอแนะนำให้คุณสร้างคลาสใหม่ชื่อ "UserModel" และสำหรับแต่ละเอนทิตีผู้ใช้ที่คุณได้รับจากฐานข้อมูลให้สร้างอินสแตนซ์ใหม่ของคลาสโมเดลข้อมูลที่เติมด้วยข้อมูลที่จำเป็นที่คุณต้องการเปิดเผย การส่งคืนอ็อบเจ็กต์ UserModel ของ IE ที่ไม่สามารถใช้งานได้เมื่อเทียบกับเอนทิตีผู้ใช้ ตรวจสอบให้แน่ใจว่าคุณสมบัติของโมเดลไม่อ้างถึงอินสแตนซ์ของคลาส UserModel นั่นคือสิ่งที่ทำให้คุณเข้าสู่ปัญหานี้
jensendp

3
ncampuzano ถูกต้องคุณไม่ต้องการส่งคืนเอนทิตีที่สร้างขึ้นโดยอัตโนมัติ หากคุณใช้กระบวนงานที่เก็บไว้สำหรับการเข้าถึงฐานข้อมูลการแยกจะชัดเจนยิ่งขึ้น คุณจะต้องสร้างออบเจ็กต์ค่า C # และแมปค่าจาก IDataReader ไปยังออบเจ็กต์ค่า เนื่องจากคุณใช้ EF จึงมีคลาสที่สร้างขึ้นสำหรับคุณ แต่คลาสเหล่านี้เป็นคลาส EF พิเศษที่รู้มากกว่าแล้วให้คุณค่ากับวัตถุ คุณควรส่งคืนออบเจ็กต์มูลค่า "โง่" ให้กับลูกค้าของคุณเท่านั้น
mckeejm

1
@Donny หากคุณใช้ DBContext หรือ Repository ในคอนโทรลเลอร์ของคุณที่ส่งคืนเอนทิตีกลับจากฐานข้อมูลคุณก็สามารถแมปวัตถุกับโมเดล (ตัวอย่างเช่น DTO) ในคอนโทรลเลอร์ ... แต่ฉันชอบที่จะมี ตัวควบคุมเรียกใช้บริการที่ส่งคืนโมเดล / DTO ลองใช้ AutoMapper - เครื่องมือที่ยอดเยี่ยมสำหรับจัดการการทำแผนที่
เบ็น

1
@NH. คุณสามารถใช้ shenanigans ดังกล่าวข้างต้นได้อย่างแน่นอน แต่ทุกอย่างมีสถานที่ โดยทั่วไป "เอนทิตี" ที่ได้รับจากการเข้าถึงชั้นข้อมูลควรอยู่ในชั้นข้อมูล สิ่งใดก็ตามที่ต้องการใช้ข้อมูลนี้ภายใน Business Layer ของแอปพลิเคชันมักจะใช้ "เอนทิตี" ในรูปแบบที่ถูกแปลงเช่นกัน (Domain Objects) จากนั้นข้อมูลที่ถูกส่งกลับไปยังและอินพุตจากผู้ใช้โดยทั่วไปจะเป็นรูปแบบอื่นเช่นกัน (โมเดล) เห็นด้วยว่าอาจเป็นเรื่องน่าเบื่อที่จะทำการเปลี่ยนแปลงประเภทนี้ทุกที่ แต่นั่นคือสิ่งที่เครื่องมืออย่าง AutoMapper มีประโยชน์จริงๆ
jensendp

147

หากคุณกำลังทำงานกับ EF นอกเหนือจากการเพิ่มโค้ดด้านล่างบน Global.asax

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);          

อย่าลืมนำเข้า

using System.Data.Entity;

จากนั้นคุณสามารถคืนโมเดล EF ของคุณเองได้

ง่ายๆแค่นั้นเอง!


แม้ว่าจะช่วย EF ได้ แต่วิธีแก้ปัญหาไม่ได้เฉพาะเจาะจงสำหรับ EF และใช้ได้กับโมเดลประเภทอื่นด้วย การใช้งานดูเหมือนจะไม่จำเป็นใน Global.asax มีไว้สำหรับคอนโทรลเลอร์หรือไม่?
Matthieu

16
คำอธิบายบางประการเกี่ยวกับสิ่งที่รหัสนี้ทำและผลกระทบจะได้รับการต้อนรับ
เจคอบ

1
ขอบคุณที่ฉันประสบปัญหาที่คล้ายกันคำตอบนี้ช่วยฉันแก้ปัญหาได้
RK_Aus

มันใช้ได้กับฉัน ไม่จำเป็นต้องเพิ่มโดยใช้ System.Data.Entity; ไปยัง global.asax ขอบคุณ.
ดร. MAF

มันได้ผล. เพิ่มโค้ดง่ายๆด้านบนบน Global.asax นั่นคือทั้งหมดไม่จำเป็นต้องนำเข้าโดยใช้ System.Data.Entity;
Hemant Ramphul

52

การให้คำตอบที่ถูกต้องเป็นวิธีหนึ่งที่จะไปอย่างไรก็ตามมันเกินความจำเป็นเมื่อคุณสามารถแก้ไขได้ด้วยการตั้งค่าคอนฟิกเดียว

ดีกว่าที่จะใช้ในตัวสร้าง dbcontext

public DbContext() // dbcontext constructor
            : base("name=ConnectionStringNameFromWebConfig")
{
     this.Configuration.LazyLoadingEnabled = false;
     this.Configuration.ProxyCreationEnabled = false;
}

ข้อผิดพลาด Asp.Net Web API: ประเภท 'ObjectContent'1' ล้มเหลวในการจัดลำดับเนื้อหาการตอบสนองสำหรับแอปพลิเคชันประเภทเนื้อหา '/ xml; charset = utf-8 '


รหัสของคุณจะถูกลบออกหากเราอัปเดตโมเดลจากฐานข้อมูล
Bimal Das

1
คุณสามารถแยกได้อย่างง่ายดายโดยการลบไฟล์. tt และมีบริบทที่ไม่ปะติดปะต่อกัน ทุกครั้งที่คุณสร้างโมเดลเพียงแค่เพิ่มคลาสใหม่ในสถานที่ @Brimal: คุณสามารถติดตาม youtube.com/watch?v=yex0Z6qwe7A
Md. Alim Ul Karim

1
เพื่อหลีกเลี่ยงการเขียนทับคุณสามารถปิดใช้งานการโหลดแบบขี้เกียจจากคุณสมบัติ edmx มันได้ผลสำหรับฉัน
Francisco G

@FranciscoG มันใช้งานได้ แต่มันจะหายไปถ้าเราลบ edmx แล้วสร้างใหม่
Md. Alim Ul Karim

1
@BimalDas ลองดูyoutube.com/… . จะไม่ลบ
Md. Alim Ul Karim

37

เพิ่มรหัสglobal.asaxนี้ด้านล่างในApplication_Start:

ปรับปรุงจากไป.Ignore .Serializeมันต้องทำงาน

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

1
ใช้งานได้ดีขอบคุณ! คุณช่วยอธิบายให้ดีขึ้นได้ไหมว่าทำไมเราต้องเอา Xml Formatter ออกเพื่อให้มันใช้งานได้
Jav_1

ไม่จำเป็นต้องเพิ่ม json serialiser (อย่างน้อยก็ในกรณีของฉัน) แต่จำเป็นต้องลบการจัดรูปแบบ Xml ฉันเดาว่า xml serialiser ไม่สามารถต่ออนุกรมประเภทที่ไม่ระบุตัวตนได้และโดยการลบออกผลลัพธ์จะถูกทำให้เป็นอนุกรมเป็น json หากการคาดเดาของฉันถูกต้องเราจะสามารถดึงข้อมูลออกจากคอนโทรลเลอร์ได้โดยขอประเภท MIME "application / json"
LosManos

11
public class UserController : ApiController
{

   Database db = new Database();

   // construction
   public UserController()
   {
      // Add the following code
      // problem will be solved
      db.Configuration.ProxyCreationEnabled = false;
   }

   public IEnumerable<User> GetAll()
    {
            return db.Users.ToList();
    }
}

ว้าวมันได้ผลสำหรับฉัน แต่ทำไม? คุณสมบัติ ProxyCreationEnabled ทำอะไร
jacktric

ทำงานกับฉัน แต่รหัสนี้คืออะไร? ฉันสังเกตด้วยว่าคลาสย่อยทั้งหมดถูกดึงด้วย null !!
Waleed A. Elgalil

10

ฉันไม่ชอบรหัสนี้:

foreach(var user in db.Users)

อีกทางเลือกหนึ่งอาจทำบางอย่างเช่นนี้ซึ่งเหมาะกับฉัน:

var listOfUsers = db.Users.Select(r => new UserModel
                         {
                             userModel.FirstName = r.FirstName;
                             userModel.LastName = r.LastName;

                         });

return listOfUsers.ToList();

อย่างไรก็ตามฉันลงเอยด้วยการใช้โซลูชันของ Lucas Roselli

ปรับปรุง: ทำให้ง่ายขึ้นโดยส่งคืนวัตถุที่ไม่ระบุชื่อ:

var listOfUsers = db.Users.Select(r => new 
                         {
                             FirstName = r.FirstName;
                             LastName = r.LastName;
                         });

return listOfUsers.ToList();

10

ฉันแก้ไขโดยใช้รหัสนี้เป็นไฟล์ WebApiConfig.cs

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
config.Formatters.Remove(config.Formatters.XmlFormatter);

ขอบคุณมาก. ไม่รู้ว่าสิ่งนี้ทำอย่างไรกับความปลอดภัย
อรุณ

6

นอกจากนี้ยังมีสถานการณ์นี้ที่ทำให้เกิดข้อผิดพลาดเดียวกัน:

ในกรณีที่ผลตอบแทนเป็นวิธีList<dynamic>web api

ตัวอย่าง:

public HttpResponseMessage Get()
{
    var item = new List<dynamic> { new TestClass { Name = "Ale", Age = 30 } };

    return Request.CreateResponse(HttpStatusCode.OK, item);
}

public class TestClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

ดังนั้นสำหรับสถานการณ์นี้ให้ใช้ [KnownTypeAttribute] ในคลาสส่งคืน (ทั้งหมด) ดังนี้:

[KnownTypeAttribute(typeof(TestClass))]
public class TestClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

สิ่งนี้ใช้ได้กับฉัน!


จะเกิดอะไรขึ้นถ้าคุณใช้ linq pivot กับคอลัมน์ไดนามิก
codegrid

[KnownTypeAttribute (typeof (TestClass))] แก้ไขปัญหาของฉัน
Guillaume Raymond

6

การเพิ่มสิ่งนี้ในApplication_Start()วิธีการGlobal.asaxไฟล์ของคุณจะช่วยแก้ปัญหาได้

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
        .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters
        .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 
// ...
}

วิธีที่ 2: [ไม่แนะนำ]
หากคุณกำลังทำงานกับ EntityFramework คุณสามารถปิดใช้งานพรอกซีในตัวสร้างคลาส DbContext ของคุณ หมายเหตุ: รหัสนี้จะถูกลบออกหากคุณอัปเดตโมเดล

public class MyDbContext : DbContext
{
  public MyDbContext()
  {
    this.Configuration.ProxyCreationEnabled = false;
  }
}

1
ขอบคุณ Suman ฉันมีปัญหาเดียวกัน ฉันกำลังทดสอบ API เว็บของฉันและติดปัญหานี้ โซลูชันของคุณช่วยแก้ปัญหาได้ ขอบคุณมาก.
TarakPrajapati

4

ที่ชื่นชอบส่วนตัวของฉัน: App_Start/WebApiConfig.csเพียงแค่เพิ่มรหัสด้านล่างเพื่อ สิ่งนี้จะส่งคืน json แทน XML ตามค่าเริ่มต้นและยังป้องกันข้อผิดพลาดที่คุณมี ไม่ต้องแก้ไขGlobal.asaxเพื่อเอาออกXmlFormatterเป็นต้น

ประเภท 'ObjectContent'1' ล้มเหลวในการจัดลำดับเนื้อหาการตอบสนองสำหรับประเภทเนื้อหา 'แอ็พพลิเคชัน / xml; charset = utf-8

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

2

ใช้ AutoMapper ...

public IEnumerable<User> GetAll()
    {
        using (Database db = new Database())
        {
            var users = AutoMapper.Mapper.DynamicMap<List<User>>(db.Users);
            return users;
        }
    }

2

ใช้เนมสเปซต่อไปนี้:

using System.Web.OData;

แทน :

using System.Web.Http.OData;

มันได้ผลสำหรับฉัน


2

เพิ่มบรรทัดด้านล่าง

this.Configuration.ProxyCreationEnabled = false;

สองวิธีในการใช้ProxyCreationEnabledเป็นfalse.

  1. เพิ่มเข้าไปในตัวDBContextสร้าง

    public ProductEntities() : base("name=ProductEntities")
    {
        this.Configuration.ProxyCreationEnabled = false;
    }

หรือ

  1. เพิ่มบรรทัดในGetวิธีการ

    public IEnumerable<Brand_Details> Get()
    {
        using (ProductEntities obj = new ProductEntities())
        {
            this.Configuration.ProxyCreationEnabled = false;
            return obj.Brand_Details.ToList();
        }
    }

2

วิธีแก้ปัญหาที่เหมาะกับฉัน:

  1. ใช้[DataContract]สำหรับคลาสและ[DataMember]แอตทริบิวต์สำหรับแต่ละคุณสมบัติเพื่อทำให้เป็นอนุกรม นี่ก็เพียงพอแล้วที่จะได้ผลลัพธ์ Json (เช่นจาก fiddler)

  2. ในการรับการทำให้เป็นอนุกรม xml เขียนในGlobal.asaxโค้ดนี้:

    var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;

  3. อ่านบทความนี้มันช่วยให้ฉันเข้าใจการทำให้เป็นอนุกรม: https://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

1

หากต้องการเพิ่มคำตอบของ jensendp:

ฉันจะส่งต่อเอนทิตีไปยังโมเดลที่ผู้ใช้สร้างขึ้นและใช้ค่าจากเอนทิตีนั้นเพื่อตั้งค่าในโมเดลที่คุณสร้างขึ้นใหม่ ตัวอย่างเช่น:

public class UserInformation {
   public string Name { get; set; }
   public int Age { get; set; }

   public UserInformation(UserEntity user) {
      this.Name = user.name;
      this.Age = user.age;
   }
}

จากนั้นเปลี่ยนประเภทการส่งคืนของคุณเป็น: IEnumerable<UserInformation>


1
มีวิธีที่สวยงามกว่าในการจัดการการแปลสำหรับคุณเพื่อที่คุณจะได้ไม่ต้องรักษาทุกคุณสมบัติ .. AutoMapper และ ValueInjecter เป็น 2 ตัวที่โดดเด่น
Sonic Soul

1

นี่คือข้อผิดพลาดของฉัน

โดยพื้นฐานแล้วฉันจะเพิ่มหนึ่งบรรทัดที่พวกเขาเป็น

  • entities.Configuration.ProxyCreationEnabled = false;

ไปยัง UsersController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using UserDataAccess;

namespace SBPMS.Controllers
{
    public class UsersController : ApiController
    {


        public IEnumerable<User> Get() {
            using (SBPMSystemEntities entities = new SBPMSystemEntities()) {
                entities.Configuration.ProxyCreationEnabled = false;
                return entities.Users.ToList();
            }
        }
        public User Get(int id) {
            using (SBPMSystemEntities entities = new SBPMSystemEntities()) {
                entities.Configuration.ProxyCreationEnabled = false;
                return entities.Users.FirstOrDefault(e => e.user_ID == id);
            }
        }
    }
}

นี่คือผลลัพธ์ของฉัน:


1

ใช้ [Serializable] สำหรับคลาส:

ตัวอย่าง:

[Serializable]
public class UserModel {
    public string Name {get;set;}
    public string Age {get;set;}
}

มันได้ผลสำหรับฉัน!


1
วลีเช่นนี้ใคร ๆ ก็แทบจะคิดว่าทุกคนที่ตอบโพสต์นี้ก่อนหน้านี้เป็นใบ้;) ... ฉันสงสัยอย่างจริงจังว่าพวกเขาเป็นดังนั้นอาจหมายความว่าวิธีการแก้ปัญหานี้ใช้ไม่ได้เมื่อถามคำถามย้อนกลับไปในปี 2015 ... ฉันไม่รู้เกี่ยวกับไวยากรณ์นั้นมากนัก แต่ฉันรู้สึกว่ามันค่อนข้างใหม่หรืออาจมีข้อบกพร่องบางประการที่ทำให้ไม่สามารถใช้งานได้ในบางกรณีการใช้งาน ฉันรู้สึกว่าโซลูชันของคุณอาจเป็นประโยชน์สำหรับผู้อ่านในอนาคตที่มาถึงคำถามนี้ แต่จะช่วยได้อย่างแน่นอนหากคุณชี้แจงข้อ จำกัด
jwatkins

1

คุณจะต้องกำหนด Serializer Formatter ภายใน WebApiConfig.cs ที่มีอยู่ใน App_Start Folder เช่น

การเพิ่ม config.Formatters.Remove (config.Formatters.XmlFormatter); // ซึ่งจะให้ข้อมูลในรูปแบบ JSON

การเพิ่ม config.Formatters.Remove (config.Formatters.JsonFormatter); // ซึ่งจะให้ข้อมูลในรูปแบบ XML


คุณสมควรได้รับเหรียญ
TheKrogrammer

1

เพียงใส่บรรทัดต่อไปนี้ใน global.asax:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;  
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

นำเข้า

using System.Data.Entity;

0

อีกกรณีหนึ่งที่ฉันได้รับข้อผิดพลาดนี้คือเมื่อแบบสอบถามฐานข้อมูลของฉันส่งคืนค่าว่าง แต่ประเภทโมเดลผู้ใช้ / มุมมองของฉันถูกตั้งค่าเป็นแบบไม่เป็นค่าว่างได้ ตัวอย่างเช่นการเปลี่ยนฟิลด์ UserModel ของฉันจากintเป็นint?แก้ไข


0

นอกจากนี้ยังเกิดขึ้นเมื่อประเภทการตอบกลับไม่ได้เป็นแบบสาธารณะ! ฉันส่งคืนคลาสภายในเมื่อฉันใช้ Visual Studio เพื่อสร้างประเภทให้ฉัน

internal class --> public class

0

ในขณะที่คำตอบทั้งหมดข้างต้นเหล่านี้ถูกต้องหนึ่งอาจต้องการตรวจสอบInnerException> exceptionMessage

หากมีข้อความเช่นนี้ "T he ObjectContext อินสแตนซ์ถูกกำจัดไปแล้วและไม่สามารถใช้สำหรับการดำเนินการที่ต้องใช้การเชื่อมต่อได้อีกต่อไป " นี่อาจเป็นปัญหาเนื่องจากพฤติกรรมเริ่มต้นของ EF

การกำหนดLazyLoadingEnabled = falseในตัวสร้าง DbContext ของคุณจะทำเคล็ดลับ

public class MyDbContext : DbContext
{
  public MyDbContext()
  {
    this.Configuration.LazyLoadingEnabled = false;
  }
}

สำหรับการอ่านรายละเอียดเพิ่มเติมเกี่ยวกับพฤติกรรม EagerLoading และ LazyLoading ของ EF โปรดดูบทความ MSDNนี้


0

ในกรณีของฉันฉันมีข้อความแสดงข้อผิดพลาดที่คล้ายกัน:

ประเภท 'ObjectContent'1' ล้มเหลวในการจัดลำดับเนื้อหาการตอบสนองสำหรับประเภทเนื้อหา 'แอ็พพลิเคชัน / xml; charset = utf-8 '

แต่เมื่อฉันเจาะลึกลงไปปัญหาคือ:

พิมพ์ 'name.SubRootType' ด้วยชื่อสัญญาข้อมูล 'SomeSubRootType: //schemas.datacontract.org/2004/07/WhatEverService' ไม่เป็นที่คาดหวัง พิจารณาใช้ DataContractResolver หากคุณกำลังใช้ DataContractSerializer หรือเพิ่มประเภทใด ๆ ที่ไม่รู้จักแบบคงที่ลงในรายการประเภทที่รู้จักตัวอย่างเช่นโดยใช้แอตทริบิวต์ KnownTypeAttribute หรือโดยการเพิ่มลงในรายการประเภทที่รู้จักที่ส่งไปยัง serializer

วิธีที่ฉันแก้ไขโดยการเพิ่มKnownType.

[KnownType(typeof(SomeSubRootType))]
public partial class SomeRootStructureType

สิ่งนี้ได้รับการแก้ไขโดยได้รับแรงบันดาลใจจากคำตอบนี้

อ้างอิง: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx


0

Visual Studio 2017 หรือ 2019 มีทั้งหมด unthoughtful เกี่ยวกับเรื่องนี้เพราะ Visual Studio ตัวเองต้องออกไปอยู่ในJSONรูปแบบในขณะที่รูปแบบเริ่มต้นของ Visual Studio เป็น " XmlFormat" (config.Formatters.XmlFormatter)

Visual Studio ควรทำสิ่งนี้โดยอัตโนมัติแทนที่จะทำให้นักพัฒนามีปัญหามากมาย

ในการแก้ไขปัญหานี้ไปที่ไฟล์WebApiConfig.csและเพิ่ม

var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);

หลัง " config.MapHttpAttributeRoutes (); " ในการลงทะเบียน (HttpConfiguration การตั้งค่า)วิธีการ สิ่งนี้จะช่วยให้โปรเจ็กต์ของคุณสร้างเอาต์พุต json


0

ในกรณีของฉันฉันแก้ไขการสร้างฐานข้อมูลใหม่ ฉันได้ทำการเปลี่ยนแปลงบางอย่างในโมเดลและเปิดตัว Update-Database ใน Package Manager Console ฉันได้รับข้อผิดพลาดต่อไปนี้:

"คำสั่ง ALTER TABLE ขัดแย้งกับข้อ จำกัด FOREIGN KEY" FK_dbo.Activities_dbo.Projects_ProjectId "ความขัดแย้งเกิดขึ้นในฐานข้อมูล" TrackEmAllContext-20190530144302 ", ตาราง" dbo.Projects ", คอลัมน์" Id ""


0

ในกรณี: หากการเพิ่มโค้ดในWebApiConfig.csหรือGlobal.asax.csไม่ได้ผลสำหรับคุณ:

.ToList();

เพิ่มฟังก์ชัน. toList ()

ฉันลองใช้วิธีแก้ปัญหาทุกอย่าง แต่วิธีต่อไปนี้ใช้ได้ผลสำหรับฉัน:

var allShops = context.shops.Where(s => s.city_id == id)**.ToList()**;
return allShops;

ฉันหวังว่ามันจะช่วยได้


0

ในกรณีของฉันมันได้รับการแก้ไขเมื่อฉันลบคำสำคัญเสมือนก่อนคุณสมบัติการนำทางของฉันฉันหมายถึงตารางอ้างอิง ดังนั้นฉันจึงเปลี่ยนไป

public virtual MembershipType MembershipType { get; set; }

ถึง:

public MembershipType MembershipType { get; set; }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.