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.
Geniale dritto! –
EF usa la colonna discriminator per fare ciò? –
@MattyM Dipende dalla strategia di ereditarietà (TPH, TPT, TPC). Con TPH vedrai il discriminatore nella clausola SELECT. –