<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ADO.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/78/ShowForum.aspx</link><description>Θέματα σχετικά με την προσπέλαση δεδομένων μέσω του ADO.NET και του System.Data namespace</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Entity Framework Code First - Loading related Entities</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/65995.aspx</link><pubDate>Wed, 25 May 2011 06:09:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:65995</guid><dc:creator>xabikos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/65995.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=65995</wfw:commentRss><description>Να φανταστώ ότι δεν έγραψα καλά το post και δεν πήρα καμία απάντηση ε; Προσπάθησα να είμαι όσο το δυνατόν πιο κατανοητός. Η μήπως δεν έχει αντιμετωπίσει κανένας άλλος κάποιο παρόμοιο θέμα;&lt;br&gt;</description></item><item><title>Entity Framework Code First - Loading related Entities</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/65802.aspx</link><pubDate>Tue, 17 May 2011 05:15:11 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:65802</guid><dc:creator>xabikos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/65802.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=65802</wfw:commentRss><description>Εδώ και λίγο καιρό προσπαθώ να κάνω ένα μικρό παράδειγμα χρησιμοποιώντας το Entity Framework για την επικοινωνία με την βάση δεδομένων. Να πω ότι έχω μια σχετική εμπειρία με NHibernate γι αυτό και προτιμώ να δουλέψω με το code first αν και η ερώτησή μου μάλλον υπάρχει και στις άλλες μεθοδολογίες (model first, database first). Αυτό που θέλω να ρωτήσω είναι αν υπάρχει μια βέλτιστη λύση για το πως ανακτούμε ένα ολόκληρο object graph; Έχω δει αρκετά παραδείγματα αλλά δε νομίζω πως έχω πετύχει τον καλύτερο τρόπο. Για να γίνω πιο συγκεκριμένος θα παραθέσω αρκετό κώδικα που ελπίζω να κάνει τα πράγματα πιο κατανοητά. &lt;br&gt;&lt;br&gt;Έχω τις εξής τρεις κλάσεις:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Field {
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt; Description { get; set; }
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; Region Region { get; set; }
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; IList&amp;lt;Crop&amp;gt; Crops { get; set;}
}

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Region {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt; Description {get; set; }
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; Region Parent {get; 	set; }
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; IList&amp;lt;Region&amp;gt; Children {get; set;}
}

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Crop{
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; Field Field { get; set;}
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;virtual&lt;/span&gt; CropKind Kind { get; set; }
}&lt;/span&gt;&lt;/pre&gt;Όπου σαν βασική οντότητα είναι η Field που έχει ένα property Region που είναι μια δενδρική δομή και επίσης έχει μια λίστα με πολλά crops που με την σειρά τους δείχνουν και αυτά σε μια άλλη κλάση τύπου CropKind που για λόγους συντομίας δεν την έγραψα. Αυτό που θέλω να μάθω είναι πως μπορώ να ανακτώ όλες τις συσχετίσεις όταν ανακτώ κάποιο συγκεκριμένο Field. Αυτό που κάνω τώρα είναι το εξής&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; Field Retrieve(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt; id) {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;using&lt;/span&gt; (var context &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; FieldsContext(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"TestCodeFirst"&lt;/span&gt;)) {
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; context.Fields
		.Include(field =&amp;gt; field.Region)
		.Include(field =&amp;gt; field.Region.Parent)
		.Include(field =&amp;gt; field.Region.Children)
		.Include(field =&amp;gt; field.Region.Parent.Children)
		.Include(field =&amp;gt; field.Crops)
		.Include(field =&amp;gt; field.Crops.Select(crop =&amp;gt; crop.Kind))
		.Include(field =&amp;gt; field.Crops.Select(crop =&amp;gt; crop.Variety))
		.Include(field =&amp;gt; field.Crops.Select(crop =&amp;gt; crop.Variety.Kind))
		.FirstOrDefault(field =&amp;gt; field.ID == id);
	}
}&lt;/span&gt;&lt;/pre&gt;Κάνει αυτό που θέλω αλλά δεν μου φαίνεται σαν τον ιδανικό τρόπο. Βέβαια και στο επίσημο &lt;a href="http://blogs.msdn.com/b/adonet/"&gt;blog&lt;/a&gt; του Entity Framework &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx"&gt;αυτόν&lt;/a&gt; το τρόπο δείχνει. Μήπως μου διαφεύγει κάτι. Να παραθέσω και το configuration που τρέχει κατά την δημιουργία του context&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; FieldConfiguration : EntityTypeConfiguration&amp;lt;Field&amp;gt; {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; FieldConfiguration() {
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.Property(p =&amp;gt; p.Description).HasColumnName(DataAccesConstants.DESCRIPTION_COLUMN_NAME);
	                &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.HasOptional(p =&amp;gt; p.Region).WithMany().Map(mc =&amp;gt; mc.MapKey(FieldConstants.REGION_ID_COLUMN_NAME));
		}
}

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; RegionConfiguration : EntityTypeConfiguration&amp;lt;Region&amp;gt; {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; RegionConfiguration() {
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.Property(p =&amp;gt; p.Description).HasColumnName(DataAccesConstants.DESCRIPTION_COLUMN_NAME);
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.HasOptional(r =&amp;gt; r.Parent).WithMany(r =&amp;gt; r.Children).Map(mc =&amp;gt; mc.MapKey(RegionConstants.PARENT_ID_COLUMN_NAME));
	}
}

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; CropConfiguration : EntityTypeConfiguration&amp;lt;Crop&amp;gt; {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; CropConfiguration() {
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.HasRequired(p =&amp;gt; p.Field).WithMany(c =&amp;gt; c.Crops).Map(mc =&amp;gt; mc.MapKey(CropConstants.FIELD_ID_COLUMN_NAME));
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.HasRequired(p =&amp;gt; p.Kind).WithMany().Map(mc =&amp;gt; mc.MapKey(CropConstants.CROPKIND_ID_COLUMN_NAME));
	}
}&lt;/span&gt;&lt;/pre&gt;Βέβαια αυτό που έχω καταλάβει είναι ότι οι σχέσεις που ορίζεις σε αυτά τα configurations λαμβάνονται υπόψιν κυρίως για την δημιουργία της βάσης αν αυτή γίνεται από το Entity framework και όχι για την ανάκτηση των δεδομένων και στην συνέχεια την δημιουργία των αντικειμένων. Θα ήθελα τις συμβουλές σας και για την κυρίως ερώτηση αλλά και για ότι άλλο χωράει βελτίωση αλλαγή. &lt;br&gt;&lt;br&gt;Σας ευχαριστώ προκαταβολικά.&amp;nbsp; &lt;br&gt;</description></item></channel></rss>