我有一个奇怪的错误.我正在试验.NET 4.5 Web API,实体框架和MS SQL Server.我已经创建了数据库并设置了正确的主键和外键以及关系.
我创建了一个.edmx模型并导入了两个表:Employee和Department.一个部门可以有很多员工,这种关系存在.我使用scaffolding选项创建了一个名为EmployeeController的新控制器,以使用Entity Framework创建一个带有读/写操作的API控制器.在向导中,选择Employee作为模型,并选择数据上下文的正确实体.
创建的方法如下所示:
public IEnumerable<Employee> GetEmployees()
{
var employees = db.Employees.Include(e => e.Department);
return employees.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
当我通过/ api/Employee调用我的API时,出现此错误:
'ObjectContent`1'类型无法序列化内容类型'application/json的响应主体; ... ... System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生错误.","ExceptionMessage":"使用类型'System.Data.Entity.DynamicProxies检测到自引用循环.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552' .Path'[0] .Department.Employees'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"...
为什么它自引用[0] .Department.Employees?这并没有多大意义.如果我在我的数据库中进行循环引用,我希望这会发生,但这是一个非常简单的例子.怎么可能出错?
我在4个表中为我的网站提供了一个mssql数据库.
我用这个时:
public static string GetAllEventsForJSON()
{
using (CyberDBDataContext db = new CyberDBDataContext())
{
return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter());
}
}
Run Code Online (Sandbox Code Playgroud)
该代码导致以下错误:
Newtonsoft.Json.JsonSerializationException:为类型为"DAL.CyberUser"的属性"CyberUser"检测到自引用循环.路径'[0] .EventRegistrations [0] .CyberUser.UserLogs [0]'.
我正在使用ASP.NET MVC Web API,我遇到了这个错误:
'ObjectContent`1'类型无法序列化内容类型'application/xml的响应主体; 字符集= UTF-8' .
我的控制器是:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
Run Code Online (Sandbox Code Playgroud)
为什么我收到这个错误?
我正在使用Entity Framework并且在向浏览器中获取父数据和子数据时遇到问题.这是我的课程:
public class Question
{
public int QuestionId { get; set; }
public string Title { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
public string Text { get; set; }
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码返回问题和答案数据:
public IList<Question> GetQuestions(int subTopicId, int questionStatusId)
{
var questions = _questionsRepository.GetAll()
.Where(a => a.SubTopicId == subTopicId …Run Code Online (Sandbox Code Playgroud) 最简单的例子,我得到一个集合并尝试通过Web API输出:
// GET api/items
public IEnumerable<Item> Get()
{
return MyContext.Items.ToList();
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
'System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]' 类型的对象 无法转换为类型
'System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]'
这是与新代理相关的一个非常常见的错误,我知道我可以通过设置来修复它:
MyContext.Configuration.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)
但这违背了我想要做的很多事情的目的.有没有更好的办法?
当我尝试使用ASP.NET Core Newsoft JSON.NET序列化某些域对象时,它会抛出异常,因为它正在检测自引用循环.
在ASP.NET 4中,我们以这种方式全局修复它: JSON.NET错误检测到类型的自引用循环
我们如何在ASP.NET Core中解决这个问题?
我的问题显示在此代码中
我有这样的课
public class maincs
{
public int a;
public int b;
public int c;
public int d;
}
public class sub1
{
public int a;
public int b;
public int c;
}
public void methoda (sub1 model)
{
maincs mdata = new maincs(){a = model.a , b = model.b , c= model.c} ;
// is there is a way to directly cast class sub1 into main like that
mdata = (maincs) model;
}
Run Code Online (Sandbox Code Playgroud) 我首先使用Entity Framework代码进行数据访问,并且我有一个具有Employees集合的Company类.Employee类还有一个Company属性.
我希望能够序列化公司并在序列化中包含员工列表.
这是公司:
public class Company
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime? Established { get; set; }
public virtual IList<Employee> Employees { get; set; }
public DateTime? DateCreated { get; set; }
public DateTime? DateUpdated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是员工
public class Employee
{
public long Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int …Run Code Online (Sandbox Code Playgroud) 我有以下类结构:
[JsonObject]
public class Polygon : IEnumerable<Point>
{
public List<Point> Vertices { get; set; }
public AxisAlignedRectangle Envelope { get; set; }
}
public class AxisAlignedRectangle : Polygon {
public double Left { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
我正在序列化这个Polygon类,但是当我这样做时,我得到一个JsonSerializationException消息"为属性'Envelope'检测到自我引用循环',类型为'MyNamespace.AxisAlignedRectangle'." 如果我将[JsonObject(IsReference = true)](如此处所述)添加到AxisAlignedRectangle,代码运行正常,但我在AxisAlignedRectangle的每个实例中获得一个自动分配的$ id字段,并在重新引用该实例时获得$ ref字段.例如,当我序列化多边形时,我得到:
{
Vertices: [ ... ],
Envelope: {
$id: '1',
Left: -5,
...
Vertices: [ ... ],
Envelope: {
$ref: '1'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望在序列化AxisAlignedRectangle时完全删除Polygon属性.我尝试DataContractAttribute在AxisAlignedRectangle类中添加一个(以及适当的DataMemberAttribute属性),但Polygon的所有属性仍然被序列化.这是意料之外的,因为 …
我正是在这个问题的相同情况下: 我如何使JSON.NET忽略对象关系?
我看到提议的解决方案,我知道我必须使用合同左轮手枪,我也看到合同解析器的代码,但我不知道如何使用它.