2012-11-02 10 views
6

ho 2 classi semplici:Entity proprietà di navigazione quadro è nullo

public class Setting 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid SettingId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public String Value { get; set; } 

    [Required] 
    public SettingCategory SettingCategory { get; set; } 
} 

public class SettingCategory 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid SettingCategoryId { get; set; } 

    [Required] 
    public String Value { get; set; } 

    public ICollection<Setting> Settings { get; set; } 
} 

Quando ho recuperare un SettingCategory dal database delle impostazioni di raccolta è sempre nullo.

Quando faccio un virtual allora si dirà: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Come posso accedere alla mia lista Settings?

Il contrario funziona, se si recupera un Setting dal database, la proprietà SettingCategory viene riempita.

Questa è la mia prima sceneggiatura code-migrazioni:

CreateTable(
    "dbo.Settings", 
    c => new 
     { 
      SettingId = c.Guid(nullable: false, identity: true), 
      Name = c.String(nullable: false), 
      Value = c.String(), 
      SettingCategory_SettingCategoryId = c.Guid(nullable: false), 
     }) 
    .PrimaryKey(t => t.SettingId) 
    .ForeignKey("dbo.SettingCategories", t => t.SettingCategory_SettingCategoryId, cascadeDelete: true) 
    .Index(t => t.SettingCategory_SettingCategoryId); 

CreateTable(
    "dbo.SettingCategories", 
    c => new 
     { 
      SettingCategoryId = c.Guid(nullable: false, identity: true), 
      Value = c.String(nullable: false), 
     }) 
    .PrimaryKey(t => t.SettingCategoryId); 

E questa è la parte che ottiene dal database:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 

risposta

ho dimenticato l'inclusione in .SettingCategories, ma lo stavo provando con una lambda:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include(s => s.Settings) 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 

che non funziona, ma questo fa:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include("Settings") 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 
+0

Questo è strano. Puoi mostrare come stai recuperando SettingCategory? – Anri

+0

Sei sicuro di avere impostazioni correlate nel tuo database? – Anri

+0

Sto usando il codice prima con le migrazioni, quindi dovrebbe fare tutto bene? Ho aggiunto il mio script iniziale. – YesMan85

risposta

16

Poiché si sta smaltendo i vostri BackofficeContext non è possibile utilizzare LazyLoading, che è ciò che sta accadendo quando si effettua Settings virtuale.

È possibile aumentare la durata del proprio BackofficeContext o carico di lavoro immediato Settings. Puoi utilizzare il caricamento bisognoso con Include.

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include(s => s.Settings) 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 
+0

Ho provato, ma il problema è che 's.Settings' non è un'espressione riconosciuta! 'Impossibile risolvere il simbolo 'Impostazioni'. Ecco perché mi sto grattando la testa. – YesMan85

+0

Ho provato questo ora: '.Include (" Impostazioni ")' e ha funzionato, strano che il lambda non funziona. – YesMan85

+11

Hai aggiunto un riferimento (usando) a System.Data.Entity? L'inclusione fortemente tipizzata è altamente raccomandata quando si esegue il refactoring. – Martin4ndersen

Problemi correlati