2016-08-13 2 views
0

In mvc AktionEntity Framework 6 nehmen Datensätze, die in der Tabelle

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

In SiteRepository

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

und anderen Repositories

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

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

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

Ich weiß nicht, existieren nicht, warum , aber im Debugger sehe ich, dass nach der Anfrage an UserSites (das erste Repository - Code - Snippet), in Site.Rows gibt es einen weiteren Datensatz, es ist der ersten Datensatz und es erstellt von Row Konstruktor, ich habe keine Ideen, warum es passiert.

Diese beiden Objekte haben verschiedene Arten der erste (die ich nicht verstehe) Domain.Entities.Row geben hat, die zweite System.Data.Entity.DynamicProxies.Row_********** (* - einige num)

Ich werde noch einmal wiederholen. In meiner Rows-Tabelle gibt es nur einen Datensatz, aber in Site.Pages [someIndex] .Rows nach der Anfrage an die Datenbank gibt es zwei Objekte und das erste existiert nicht in der Tabelle, es erstellt von Row-Konstruktor. Warum passiert es?

Code of Site-Klasse

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"; 
    } 
} 

Seite Klasse

[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() 
     }; 
    } 
+0

Es muss etwas in Ihrem Code sein. Können Sie den Code der 'Site' Klasse anzeigen? –

+0

@IvanStoev Fertig. In diesem Moment lösche ich manuell die zusätzliche Zeile in der mvc-Aktion, aber ich würde gerne wissen, wo der Fehler liegt. – Nikita

+0

Danke. Aber wo ist 'Site.Rows'? –

Antwort

0

Siehe Lösung in den Kommentaren zu der Frage, großen Dank an Ivan Stoev. Problem war im Entitätskonstruktor.

0

Zuerst würde ich davon ausgehen, dass Ihre Websites und Seiten einige Beziehungen haben. Wenn Sie versuchen, Daten aus der Standorttabelle abzurufen, erhalten Sie Daten aus der Seitentabelle sowie Seiten in der dbcontext-Abfrage. Wenn Sie in dbcontext also include sehen, haben Sie einen linken äußeren Join zwischen Sites und Seiten erstellt.

Sie können mehr auf eifrigen Laden auf http://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx überprüfen. Lassen Sie mich wissen, ob es Ihre Anfrage löst.

Verwandte Themen