2012-12-22 9 views
5

Es gibt viele Beispiele für C#/Entity Framework zum Abfragen und Zugreifen auf Eigenschaften einer Klasse, in denen die Klasse eine Eigenschaft (keine Unterklasse) ist. einer anderen Klasse.Entity Framework-Typ pro Klasse: C#, Zugriff auf untergeordnete Unterklasse, die KEINE Navigationseigenschaft einer anderen Klasse ist

Hier ist also eine Frage zum Abfragen und dann Zugriff auf eine Unterklasse, die eine Navigationseigenschaft einer Klasse von SQL Server mit Entity Framework ist.

Es gibt auch kein Beispiel, wie ich Abfrage und Zugriff auf eine Unterklasse, die keine Navigationseigenschaft einer Klasse ist, finden konnte.

Ich verstehe einfach nicht, warum Microsoft nicht so ein rudimentäres Beispiel haben.

// Frage: Wie erstelle ich eine Abfrage für den Zugriff auf die Eigenschaft von rssBlog (eine Unterklasse von Blog) mit Select? // Frage: Wie iterieren I db (Datenbankkontext) alle Werte von rssBlog.RssFeed

Below zu bekommen, ist ein Arbeitsbeispielcode von Microsoft mit eingesetzter Frage:

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 Type pro Klasse: Zugriff auf untergeordnete Unterklasse, die keine Navigationseigenschaft einer anderen Klasse ist // Frage: Wie erstelle ich eine Abfrage, um auf die Eigenschaft von rssBlog (eine Unterklasse von Blog) zuzugreifen, indem ich select?

// Frage: Wie iterieren ich db.Blogs alle Werte von rssBlog.RssFeed

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

// Diese Show nur zu bekommen, wie Blog zugreifen, ein Elternteil von RssEnabledBlog. // Ich wollte auch auf rssBlog.RssFeed zugreifen. Wie?

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

}

Dieser Code funktioniert. Hier ist SSMS Bildschirm Schnappschuss: (Bin ein neuer Benutzer ... Ich kann ein Bild noch nicht posten)

Danke.

Antwort

2

Der Schlüssel ist, dass Sie tun können,

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

OfType das Verfahren Untertypen von einer Basisklasse zu holen.

Dann können Sie mit z.B.

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

Geradeaus Genie! –

+0

Verwendet EF die Diskriminator-Spalte, um dies zu tun? –

+0

@MattyM Das hängt von der Vererbungsstrategie ab (TPH, TPT, TPC). Mit TPH sehen Sie den Diskriminator in der SELECT-Klausel. –

Verwandte Themen