2012-12-22 9 views
5

Esistono molti esempi di C#/Entity Framework di query e accesso alla proprietà di una classe in cui la classe è una proprietà (non una sottoclasse) di un'altra classe.Entity Framework Tipo per Classe: C#, Accesso alla sottoclasse child che NON è una proprietà di navigazione di un'altra classe

Quindi, ecco una domanda su come interrogare e quindi accedere a una sottoclasse che è una proprietà di navigazione di qualsiasi classe dal server SQL utilizzando Entity Framework.

Esiste anche un esempio NO su come interrogare e accedere a una sottoclasse che NON è una proprietà di navigazione di alcuna classe.

Semplicemente non capisco perché Microsoft non abbia un esempio così rudimentale.

// Domanda: Come si crea una query per accedere alla proprietà di rssBlog (una sottoclasse di Blog) utilizzando select? // Domanda: Come faccio a iterare db (contesto di database) per ottenere tutti i valori di rssBlog.RssFeed

seguito è riportato un codice di esempio di lavoro da Microsoft con le domande inserite:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Data.Entity; 
    using System.Diagnostics; 

    namespace BCodeFirstNewDatabaseSample_TPT 
    { 
     class Program 
     { 
    static void Main(string[] args) 
    { 
     try 
     { 
      using (var db = new BloggingContext()) 
      { 
       // Create and save a new Blog 
       Console.Write("Enter a name for a new Blog: "); 
       var name = Console.ReadLine(); 

       var blog = new Blog { Name = name }; 
       db.Blogs.Add(blog); 

       var rssBlog = new RssEnabledBlog 
       { 
        RssFeed = "rssFeed1" 
       }; 
       db.Blogs.Add(rssBlog); 
       db.SaveChanges(); 

       // Display all Blogs from the database 
       var query = from b in db.Blogs 
          orderby b.Name 
          select b; 

// Entity Framework Tipo per Classe: accesso alla sottoclasse child che non è una proprietà di navigazione di un'altra classe // Domanda: Come posso creare una query per accedere alla proprietà di rssBlog (una sottoclasse di Blog) utilizzando select?

// Domanda: Come posso iterare db.Blogs per ottenere tutti i valori di rssBlog.RssFeed

   Console.WriteLine("All blogs in the database:"); 
       foreach (var item in query) 
       { 

// Questo spettacolo unico come accedere Blog, un genitore di RssEnabledBlog. // Devo accedere anche a rssBlog.RssFeed. Come?

    Console.WriteLine(item.Name); 
       } 

       Console.WriteLine("Press any key to exit..."); 
       Console.ReadKey(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.Write("exception {0}",e.Message); 
     } 
    } 
}//program 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public DateTime? Datetime { get; set; }// make DataTime nullable to avoid exception? 

    public virtual List<Post> Posts { get; set; } 
} 
public class RssEnabledBlog : Blog 
{ 
    public string RssFeed { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
    public BloggingContext() 
    {//Data Source=.\SQLEXPRESS;Initial Catalog=BCodeFirstNewDatabaseSample_TPT.BloggingContext;Integrated Security=True;MultipleActiveResultSets=True; 

     Debug.Write(Database.Connection.ConnectionString); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {// Thismapping creates Blog and RssEnabledBlog tables 
     modelBuilder.Entity<Blog>() 
        .Map(m => m.ToTable("Blogs")); 
     //base.OnModelCreating(modelBuilder); 
    } 
} 

}

Questo codice funziona. Ecco lo snapshot della schermata SSMS: (Sono un nuovo utente ... Non riesco ancora a pubblicare un'immagine)

Grazie.

risposta

2

La chiave è che si può fare

from reb in db.Blogs.OfType<RssEnabledBlog>() 

OfType è il metodo per recuperare sub tipi di una classe base.

Quindi è possibile procedere ad es.

orderby reb.Name 
select new { reb.Name, reb.RssFeed } 
+0

Geniale dritto! –

+0

EF usa la colonna discriminator per fare ciò? –

+0

@MattyM Dipende dalla strategia di ereditarietà (TPH, TPT, TPC). Con TPH vedrai il discriminatore nella clausola SELECT. –

Problemi correlati