Log*_*man 5 sql linq asp.net entity-framework asp.net-web-api
我目前正在使用实体框架(我知道它不是最稳定的平台)使用数据库优先方法处理 Web API 项目,但我遇到了一些非常奇怪的事情。
当我的 APIController 中的 GET 方法尝试返回 DbSet 中包含 LINQ Include() 方法的所有记录时,它将返回 500 错误:
// GET api/Casinos
public IEnumerable<casino> Getcasinos()
{
var casinos = db.casinos.Include(c => c.city).Include(c => c.state);
return casinos.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
然而,这个方法工作正常,并从我的数据库中返回我的数据:
// GET api/States
public IEnumerable<state> Getstates()
{
return db.states.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
所以我已经在其他实例中证明,如果它返回没有 LINQ 查询的实体,它工作得很好,但是当在 DbContext 上使用 Include 方法时,它会失败。
当然,即使使用 Fiddler、Chrome/Firefox 开发工具并添加 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
如果有人解决了这个问题,很高兴知道一个不错的解决方案,这样我就可以开始返回我的数据了!谢谢!:)
PS 我使用的是 SQL Server 2012
这是由于序列化 (Json/XML) 错误而发生的。问题是您直接尝试通过线路传输模型。举个例子,看看这个:
public class Casino
{
public int ID { get; set; }
public string Name { get; set; }
public virtual City City { get; set; }
}
public class State
{
public int ID { get; set; }
public string Name { get; set; }
[XmlIgnore]
[IgnoreDataMember]
public virtual ICollection<City> Cities { get; set; }
}
public class City
{
public int ID { get; set; }
public string Name { get; set; }
public virtual State State { get; set; }
[XmlIgnore]
[IgnoreDataMember]
public virtual ICollection<Casino> Casinos { get; set; }
}
public class Context : DbContext
{
public Context()
: base("Casino")
{
}
public DbSet<Casino> Casinos { get; set; }
public DbSet<State> States { get; set; }
public DbSet<City> Cities { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
注意XmlIgnore
和IgnoreDataMember
。您需要限制避免序列化,这样它就不会以循环方式发生。此外,上述模型仍然无法工作,因为它具有虚拟性。从任何地方删除虚拟,即City
、Cities
、Casinos
然后State
它会起作用,但效率很低。
总结一下:使用 DTO 并仅发送您真正想要发送的数据,而不是直接发送您的模型。
希望这可以帮助!
归档时间: |
|
查看次数: |
4977 次 |
最近记录: |