2016-09-20 2 views
2

Merci pour les réponses, être plus clare, j'ai re-orged ma question comme suit:code EF Première: Seulement définir la clé étrangère (ID) et d'obtenir une collection nulle de la propriété de navigation

public class App 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual IEnumerable<Build> Builds { get; set; } 
} 

public class Build 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public Guid AppId { get; set; } 

    [ForeignKey("AppId")] 
    public virtual App App { get; set; } 
} 


public class TestContext : DbContext 
{ 
    public TestContext() : base("name=DefaultConnection") 
    { 
     Database.SetInitializer<TestContext>(new CreateDatabaseIfNotExists<TestContext>()); 
    } 

    public DbSet<App> Apps { get; set; } 
    public DbSet<Build> Builds { get; set; } 
} 

étape 1> Enregistrer les données

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (TestContext context = new TestContext()) 
     { 
      var id = Guid.NewGuid(); 
      App app = new App() { Id = id }; 
      Build build = new Build() 
      { 
       Id = Guid.NewGuid(), 
       AppId = id 
      }; 
      context.Apps.Add(app); 
      context.Builds.Add(build); 
      context.SaveChanges();; 
     } 

    } 
} 

étape 2> données

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (TestContext context = new TestContext()) 
     { 
      var builds = context.Apps.FirstOrDefault().Builds; 
      Console.Read(); 
     } 
    } 
} 

Le var construit obtenir une valeur nulle, alors que je vérifie la base de données, e La valeur de la clé étrangère est bien sauvegardée.

+0

Quelle est votre «requête EF» pour cela? mettre ce code aussi. – Sampath

+0

Je ne suis pas sûr comment cela est mis en place. Y a-t-il une raison pour que votre table Build soit représentée par une classe nommée 'App'? Est-ce juste une faute de frappe? Alors qu'est-ce que AppBuild? – KSib

+0

une simple requête >> app.Builds –

Répondre

0

Il est probable que votre EF local n'ait pas été actualisé avec la nouvelle collection de l'application. Vous devrez peut-être actualiser l'objet App de votre base de données.

How to Refresh DbContext

+0

wantna savoir si seulement définir la propriété AppId dans l'objet de construction fonctionne? J'ai redémarré VS servral fois, ne fonctionne toujours pas –

+0

La définition de AppBuild.AppId, puis la persistance de cet objet dans la base de données devrait vous permettre d'interroger la propriété App.Builds. La clé, cependant, est que vous devez enregistrer les modifications dans votre base de données, puis actualiser vos données. Redémarrer Visual Studio ne fera rien. – drovani

1

Je suppose que vous utilisez le chargement avide et n'avez pas spécifié Include() pour cette propriété (probable), qui ressemblerait à quelque chose comme

context.Apps.Where(...).Include(a => a.Builds).ToList() 

ou si vous utilisez le chargement explicite et n'ont pas appelé Load() (moins probable).

+0

App app = nouvelle App() {id = 1 ...}; Build build = new Construire {.. AppId = 1} var builds = app.Builds(); et construit = null; –

+0

Ce n'est pas une requête. C'est juste du code qui construit votre graphe d'objets. – Kit