Web API和EF导致InvalidOperationException

Jac*_*ith 4 rest entity-framework asp.net-mvc-4 asp.net-web-api

我的解决方案中有3个项目:DataModel(EF),DAL,它与DataModel和MVC Web API的实体一起使用.

只有2个非常简单的实体:Person,Address,每个都有3个简单的字段,Person有Address字段(所以这2个实体是链接的)

在我的DAL中,我有一个方法可以返回所有Persons的列表,内容非常简单:return context.Person.ToList();

现在在我的Web API中,我只是调用GetPersons()方法并尝试返回它.在这里我得到一个奇怪的错误信息:

"发生了错误.","ExceptionMessage":"'ObjectContent`1'类型无法序列化内容类型'application/json; charset = utf-8'的响应主体.","ExceptionType":"系统. InvalidOperationException","StackTrace":null,"InnerException":{"$ id":"2","Message":"发生了错误.",...

当我调试时,我可以看到我确实拥有来自GetPersons方法的数据.我也googled并找到唯一的解决方案:我应该在我的启动配置中添加以下行:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.

我还尝试手动填充列表而不使用数据库:在这种情况下它可以工作.

我有一种强烈的印象,它与EF有关,但我不确切知道那是什么.

Ste*_*hen 5

  • 循序渐进指南......

步骤1:转到Entity Project,然后找到继承自DbContext类的类的名称.

例如:如果类名是MyProjectEntities,如下所示:

public partial class MyProjectEntities : DbContext
{
   //Auto Generated statements if EF is used.
}
Run Code Online (Sandbox Code Playgroud)

步骤2:转到WebApi项目,找到继承自ApiController的控制器,然后在该控制器中为MyProjectEntities类创建实例.

例如:如果Api Controller名称是PersonController,则按如下方式为MyProjectEntities创建实例:

public class PersonController : ApiController
{
   MyProjectEntities DB = new MyProjectEntities();
}
Run Code Online (Sandbox Code Playgroud)

步骤3:为PersonController类创建构造函数,并将false设置为ProxyCreationEnabled属性,如下所示:

public PersonController()
{
   DB.Configuration.ProxyCreationEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)

web api控制器中的最终代码与此类似:

public class PersonController : ApiController
{
   MyProjectEntities DB = new MyProjectEntities();
   public PersonController()
   {
      DB.Configuration.ProxyCreationEnabled = false;
   }
...
...
Run Code Online (Sandbox Code Playgroud)