我正在尝试从带有控制器的get请求的表中获取数据。当我使用普通表(TestTable)发出请求时,这没关系,但如果我使用关系表发出请求,我会收到失败消息:
“'ObjectContent`1'类型无法序列化响应正文 内容类型'application / xml;字符集= UTF-8' 。“
我的控制器(Mdata):
namespace ScThAsp.Controllers
{
public class MDataController : ApiController
{
public IEnumerable<Måledata> Get()
{
using (var e = new SCTHDBEntities())
{
return e.Måledata.ToList();
}
}
public TestTable Get(int id)
{
using (SCTHDBEntities entities = new SCTHDBEntities())
{
return entities.TestTable.FirstOrDefault(e => e.Id == 1);
}
}
}
}
我的måledata表是:
public partial class Måledata
{
public int MDid { get; set; }
public Nullable<int> BBid { get; set; }
public Nullable<decimal> Måling1 { get; set; }
public Nullable<decimal> Måling2 { get; set; }
public Nullable<decimal> Måling3 { get; set; }
public Nullable<decimal> Måling4 { get; set; }
public Nullable<System.DateTime> RegTid { get; set; }
public virtual BuildBoard BuildBoard { get; set; }
}
我的数据库看起来像: Database 见链接..
我想我可能应该与连接到Måledata表的另一个表进行内连接 - 我不确定如何在EF环境中这样做。
我现在真的尝试了很多 - 希望得到答案。感谢
答案 0 :(得分:0)
您的班级Måledata
包含您提供的更多数据(标记为partial
),可能包含与EF相关的内容。这个神奇的东西是不可序列化的。为了避免问题重写结果到具有您需要的属性的普通对象。该对象必须是可序列化的(如果包含普通的属性和类)。
答案 1 :(得分:0)
在Piotr Stapp's
答案的基础上,您需要为Måledata
创建一个DTO(数据传输对象),其中包含属性作为您的模型,Måledata
而不是EF属性。使用某种Mapper,可能AutoMapper
来映射最终响应中所需的属性。
public class MaledataDTO
{
public int MDid { get; set; }
public int? BBid { get; set; }
public decimal? Måling1 { get; set; }
public decimal? Måling2 { get; set; }
public decimal? Måling3 { get; set; }
public decimal? Måling4 { get; set; }
public DateTime? RegTid { get; set; }
//... other properties
}
public IEnumerable<MaledataDTO> Get()
{
using (var e = new SCTHDBEntities())
{
var result = e.Måledata.ToList();
return Mapper.Map<List<MaledataDTO>>(result);
}
}
答案 2 :(得分:0)
我找到了2个解决方案。 1)解决方案是使用Automapper(感谢Abdul)。安装automapper和使用自动映射器。添加了一个名为MåledataDTO的类:`publicclassMåledataDTO {
public int MDid { get; set; }
public int? BBid { get; set; }
public decimal? Måling1 { get; set; }
public decimal? Måling2 { get; set; }
public decimal? Måling3 { get; set; }
public decimal? Måling4 { get; set; }
public DateTime? RegTid { get; set; }
//... other properties
}
` 在我的控制器中,我使用了以下代码
public IEnumerable<MåledataDTO> Get()
{
using (var e = new SCTHDBEntities())
{
Mapper.Initialize(config =>
{
config.CreateMap<Måledata, MåledataDTO>();
});
var result = e.Måledata.ToList();
return Mapper.Map<List<MåledataDTO>>(result);
2:在第二个解决方案中:在图片中,您可以看到表之间的关系 - 在VS中制作 - 但这会在表Get SET类中产生问题。该关系在类中创建一个虚拟对象 - 就像之前提到的那样
public virtual BuildBoard BuildBoard { get; set; }
如果你删除关系并使公共部分类Måledata像 在这个视频中 https://www.youtube.com/watch?v=4Ir4EIqxYXQ 然后控制器应该有两种解决方案之一:
using (SCTHDBEntities e = new SCTHDBEntities()) {
//this works
//var knud = new List<Måledata>();
//knud = (e.BuildBoard.Join(e.Måledata, c => c.BBid, o => o.BBid,
// (c, o) => o)).ToList();
//return knud;
//this works too
return (from p in e.BuildBoard
where p.BBid == 1
from r in e.Måledata
where r.BBid == p.BBid
select p).ToList();
那是那个
格姆