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有关,但我不确切知道那是什么.
步骤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)
| 归档时间: |
|
| 查看次数: |
5153 次 |
| 最近记录: |