代码之家  ›  专栏  ›  技术社区  ›  enavuio

ASP。NET CORE 1.0存储库加载相关数据EF CORE

  •  0
  • enavuio  · 技术社区  · 8 年前

    我正在创建ASP。NET Core 1.0和我在RC1中创建了相同的应用程序。我在使用EF Core查询相关表数据时遇到问题。

    以前我用的是EF7,不管现场是否有数据,一切都很好。我的问题是,当我使用时,它不会返回所有记录的集合。包括。我用nuget控制台创建了我的模型,使用上的示例 https://docs.efproject.net/en/latest/querying/related-data.html :

    Scaffold DbContext“服务器=(localdb)\mssqlocaldb;数据库=博客;Trusted_Connection=True;”Microsoft.EntityFrameworkCore。SqlServer-OutputDir模型

    public partial class Complaint
    {
        public Complaint()
        {
            Checklist = new HashSet<Checklist>();
            Clnotes = new HashSet<Clnotes>();
    
        }
    
        public int CompId { get; set; }
        public string FileNum { get; set; }
        public DateTime? ReceivedDt { get; set; }
        public DateTime? CompletedDt { get; set; }
    
    
           public virtual ICollection<Checklist> Checklist { get; set; }
        public virtual ICollection<Clnotes> Clnotes { get; set; }
        }
    

    我的GetAll存储库():

        public IEnumerable<Complaint> GetAll()
        {
            try
            {
                return _context.Complaint
                    //.Include(t => t.Checklist)
                    //.Include(cl => cl.Clnotes)
                    .ToList();
            }
            catch (Exception ex)
            {
                _logger.LogError("Could not get complaint with checklist", ex);
                return null;
            }
        }
    

    问题

    为什么当我使用包含相关表的EF7时,数据库中的每个记录都包含了数据。对于EF Core,当我包括检查表或clnotes表时,只显示一条记录?当我不包括相关表格时,所有投诉都会显示出来。

    2 回复  |  直到 8 年前
        1
  •  0
  •   chiqo47    8 年前

    我也有同样的问题。我不知道为什么会这样,但在包含后选择字段为我解决了这个问题。请尝试这样做:

    return _context.Complaint
        .Include(t => t.Checklist)
        //.Include(cl => cl.Clnotes)
        .Select(c => new {
            c.CompId, c.FileNum, c.Checklist, // c.Clnotes
        )
        .ToList();
    

    您可能需要将方法类型从IEnumerable更改为其他类型,如IActionResult。

        2
  •  0
  •   Billy    8 年前

    您需要添加以下行以避免循环引用

    services.AddMvc().AddJsonOptions(options =>
                {
                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                });