【问题标题】:error occurred when requesting data via Entity Framework通过实体框架请求数据时发生错误
【发布时间】:2015-04-03 12:06:23
【问题描述】:

我正在构建一个 N 层应用程序,它必须发送 JSON 数据,这些数据是通过 Enity Framework 从 SQL Server 2012 读取的。

当我尝试请求一组用户时,我得到一个“发生错误”页面。它适用于硬编码数据。

这是我的代码:

public IEnumerable<User> Get()
{
    IUserManager userManager = new UserManager();
    return userManager.GetUsers();
}


public IEnumerable<User> GetUsers()
{
    return repo.ReadUsers();
}

public IEnumerable<User> ReadUsers()
{
    IEnumerable<User> users = ctx.Users.ToList();
    return users;
}

“ctx”是对 DbContext 对象的引用。

编辑:这可行:

public IEnumerable<User> Get()
{
    IList<User> users = new List<User>();
    users.Add(new User() { FirstName = "TestPerson1" });
    users.Add(new User() { FirstName = "TestPerson2" });

    return users;
}

浏览器截图:http://i.imgur.com/zqG0qe0.png

编辑:完整错误(屏幕截图):http://i.imgur.com/dt48tRG.png

提前致谢。

【问题讨论】:

  • 您能否发布有关收到的错误的更多信息?浏览器截图?内部异常?堆栈跟踪?
  • 给我们出现在ctx.Users.ToList(); 中的异常。你的快照根本没有帮助。
  • 它没有给出异常,只是显示这个页面
  • @Sn0wBlind 在用户返回的地方设置断点。并查看数据是否存在
  • @Sn0wBlind 尝试启用异常msdn.microsoft.com/en-us/library/038tzxdw.aspx

标签: c# asp.net entity-framework asp.net-web-api


【解决方案1】:

如果您的网站返回内部错误并且没有调用堆栈,则您没有看到完整的异常(这使得准确指出您的问题有点困难)。
因此,首先要使用调用堆栈获取实际异常,您有 2 个方法。

  • 调试网站:在本地启动网站或将调试器附加到本地运行的网站。在单步执行代码时,调试器会在遇到异常时停止,然后您会看到异常详细信息。
  • 禁用自定义错误:IIS 想要保护您的内部工作,因此标准行为是不显示完整的异常。要禁用此行为,请编辑您的 web.config 并在
  • 下添加 xml 节点

收到实际异常后,请使用调用堆栈和真正的内部服务器错误更新您的问题。我的猜测是你有一个序列化问题,也许是某种循环引用。您的解决方法是制作一个简单的 viewModel(而不是直接返回实体)或添加序列化设置(例如 json.net 支持循环引用)。

编辑
正如怀疑的那样,序列化给你带来了困难。原因是延迟加载使用的代理创建。 您可以使用以下代码禁用代理创建(请注意,这也会禁用延迟加载)。

public IEnumerable<User> ReadUsers()
{
    ctx.Configuration.ProxyCreationEnabled = false;
    IEnumerable<User> users = ctx.Users.ToList();
    return users;
}

如果这可行,您可能会考虑在上下文初始化期间禁用代理创建。

【讨论】:

  • @仅将纯模型返回给客户端
  • 我同意 Artiom 的观点,即映射实体是个好主意。但是因为我不想强迫我的编码风格,而且你似乎不想映射(因为你不接受他的回答)我在我的回答中提供了另一个工作。
  • @Kristof The ProxyCreationEnabled = false 确实解决了我面临的问题
  • @Sn0wBlind 考虑到您向客户发送用户的所有个人数据。
  • @Artiom 是的,我知道,这更像是一个测试,看看出了什么问题。不过感谢您的提醒;)
【解决方案2】:

尝试返回普通模型,smth like

var logins = ctx.Users.Select(user => new FlatUserModel
                                    {
                                        Id = user.Id,
                                        Name = user.UserName,
                                        Email = user.Email
                                    })
                                    .ToArray();
return logins;

同时在浏览器中查看你会得到什么响应。

【讨论】:

  • 更新:在 Internet Explorer 中工作。忘了告诉 Chrome 默认请求 XML。
  • @Sn0wBlind 没有帮助?根据您的异常 - 导航属性导致此异常
【解决方案3】:

由于它适用于硬编码数据,因此可能会在上下文中启用延迟加载。

如果是这样,请在上下文中禁用延迟加载或类似这样,以便序列化为 JSON 不会从数据库加载实体。

public IEnumerable<User> ReadUsers()
{
    ctx.Configuration.LazyLoadingEnabled = false;
    IEnumerable<User> users = ctx.Users.ToList();
    return users;
}

【讨论】:

  • 没有解决问题,不过感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 2016-05-04
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多