加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET Web API – 实体框架 – .Include上的500内部服务器错误

发布时间:2020-12-16 06:22:20 所属栏目:asp.Net 来源:网络整理
导读:我目前正在开发一个使用Entity Framework的 Database-First方法的Web API项目(我知道它不是最稳定的平台),但我遇到了一些非常奇怪的事情. 当我的APIController中的GET方法尝试返回DbSet中所有涉及LINQ Include()方法的记录时,它将返回500错误: // GET api/C
我目前正在开发一个使用Entity Framework的 Database-First方法的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();
        }

但是,这种方法工作正常,并从我的数据库中返回我的数据:

// GET api/States
    public IEnumerable<state> Getstates()
    {
        return db.states.AsEnumerable();
    }

所以我在其他实例中已经证明,如果它返回没有LINQ查询的实体,它可以很好地工作,但是当在DbContext上使用Include方法时,它会失败.

当然,尝试找到这个错误是不可能的,即使使用Fiddler,Chrome / Firefox开发工具,并添加GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

如果有人已经解决了这个问题,那么知道一个好的解决方案会很好,所以我可以开始返回我的数据!谢谢!:)

附:我正在使用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; }
}

注意XmlIgnore和IgnoreDataMember.您需要限制避免序列化,因此不会以循环方式发生.此外,上述模型仍然不起作用,因为它具有虚拟.从城市,城市,赌场和国家的所有地方删除虚拟,然后它会工作,但这将是低效的.

总结:使用DTO并仅发送您真正想要发送的数据,而不是直接发送模型.

希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读