c#asp.net使用实体框架数据库在关系表上发出get请求

时间:2018-03-08 08:45:42

标签: c# asp.net database entity-framework get-request

我正在尝试从带有控制器的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环境中这样做。

我现在真的尝试了很多 - 希望得到答案。感谢

3 个答案:

答案 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();
那是那个 格姆