通过Entity Framework请求数据时发生错误

时间:2015-04-03 12:06:24

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

我正在构建一个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

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果您的网站返回内部错误而没有调用堆栈,则您没有看到完整的异常(这使得很难准确地指出您的问题)。
所以首先要通过调用堆栈来获得实际的异常,你有两种方法。

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

在您收到实际异常后,请使用call stack&amp; amp;更新您的问题。真正的内部服务器错误。我的猜测是你有一个序列化问题,也许是某种循环引用。您正在修复的是创建一个简单的viewModel(而不是直接返回实体)或添加序列化设置(例如,json.net支持循环引用)。

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

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

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

答案 1 :(得分:1)

尝试返回普通模型,像

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

同时在浏览器中查看您的回应。

答案 2 :(得分:0)

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

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

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