实体框架6获取表中不存在的记录

时间:2016-08-13 08:32:14

标签: c# asp.net-mvc entity-framework

在mvc行动中

Site site = siteRepository.UserSites(userId).Where(x => x.Order == siteOrder).Last();

在SiteRepository中

 public IEnumerable<Site> UserSites(string userId)
 {
     return context.Sites.Include("Pages").Where(x => x.UserId == userId);
 }

和其他存储库

public IEnumerable<Row> Items
{
    get
    {
        return context.Rows;
    }
}

public IEnumerable<Page> Items
{
    get
    {
        return context.Pages;
    }
 }

 public IEnumerable<AbstractBuildBlock> Items
 {
     get
     {
         return context.BuildBlocks;
     }
 }

我不知道为什么,但是在调试器中我看到在向UserSites(第一个存储库代码片段)请求之后,在Site.Rows中还有一个记录,它是第一个记录,它是由Row构造函数创建的,我没有任何想法为什么会发生。

这两个对象有不同的类型,第一个(我不明白)有类型Domain.Entities.Row,第二个System.Data.Entity.DynamicProxies.Row_**********(* - 有些数字)

我会再重复一次。在我的Rows表中只有一条记录,但是在Site.Pages [someIndex]中。对数据库请求后有两个对象,第一个在表中不存在,它由Row构造函数创建。为什么会这样?

网站代码类

public class Site
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required(ErrorMessage ="Please, enter the site local name")]
    [Display(Name ="Local name")]
    public string LocalName { get; set; }
    [Required(ErrorMessage = "Please, enter the site public name")]
    [Display(Name ="Public name")]
    public string PublicName { get; set; }
    [Display(Name ="Menu variant")]
    public string MenuVariant { get; set; }
    [Display(Name = "Color theme")]
    public string ColorTheme { get; set; }
    public string IconUrl { get; set; }
    public string UserId { get; set; }
    public int Order { get; set; }
    public int NextPageOrder { get; set; }
    public virtual List<TopMenuItem> TopMenuItems { get; set; }
    public virtual List<LeftMenuItem> LeftMenuItems{ get; set; }
    public virtual List<Page> Pages { get; set; }
    public Page ActivePage { get; set; }
    public int ActivePageIndex { get; set; }

    public Site()
    {
        NextPageOrder = 1;
        MenuVariant = "top";
        ColorTheme = "dark";
    }
}

页面课程

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Name { get; set; }
    public virtual List<Row> Rows { get; set; }
    public int SiteId { get; set; }
    public virtual Site Site { get; set; }
    public int Order { get; set; }
    public int NextRowOrder { get; set; }
    public Page()
    {
        Title = "title";
        Rows = new List<Row>()
        {
            new Row()
        };
    }

2 个答案:

答案 0 :(得分:0)

首先,我假设您的网站和网页有一些关系。当您尝试从站点表中获取数据时,您将从页面表中获取数据,并且您已在dbcontext查询中包含页面。 因此,如果您在dbcontext中看到使用include,则在站点和页面之间进行了左外连接。

您可以查看有关预先加载的更多信息  http://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx。 如果它能解决您的疑问,请告诉我。

答案 1 :(得分:0)

在问题评论中查看解决方案,非常感谢Ivan Stoev。问题出在实体构造函数中。

相关问题