2015-05-17 30 views
9

क्या कोई भी मिनी-गाइड लिख सकता है जो बताता है कि ईएफ में संग्रह के साथ कैसे काम करना है?संग्रह के साथ कैसे काम करें

उदाहरण के लिए मैं निम्नलिखित है मॉडल:

public class BlogPost 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DateTime DateTime { get; set; } 
    public List<PostComment> Comments { get; set; } 
} 

public class PostComment 
{ 
    public int Id { get; set; } 
    public BlogPost ParentPost { get; set; } 
    public string Content { get; set; } 
    public DateTime DateTime { get; set; } 
} 

और संदर्भ वर्ग:

public class PostContext : DbContext 
{ 
    public DbSet<BlogPost> Posts { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Posts;Trusted_Connection=True;MultipleActiveResultSets=true"); 

    } 
    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 

    } 
} 

क्या मैं OnModelCreating विधि में लिखने के लिए इतना है कि मैं Posts.Add और आदि का उपयोग कर सकते की जरूरत है मेरे कोड में हर जगह?

+0

आपको लगता है कि विधि में नहीं लिखना चाहिए अपने dbsets में इकाई जोड़ने के लिए। क्या आप किसी भी मुद्दे का प्रयोग कर रहे हैं? –

+0

@FabioCarello मुझे "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के उदाहरण पर सेट नहीं है।", जब मैं पोस्ट प्राप्त करने का प्रयास करता हूं। टिप्पणियाँ। गणना (टिप्पणियों के साथ कुछ पोस्ट पहले जोड़े गए थे)। यही कारण है कि मैंने सवाल पूछा। – neonhash

+0

"मिनी-गाइड जो बताता है कि ईएफ में संग्रह के साथ कैसे काम करना है?" बहुत व्यापक है। यह विशेष क्षेत्र ईएफ 6 के समान होगा। –

उत्तर

17

यहाँ के लिए मेरे सुझाव दिए गए हैं अब, टिप्पणी और पोस्ट के बीच एक-से-अनेक संबंध मानते हुए इकाई फ्रेमवर्क कोर में नेविगेशन गुणों के साथ काम करना।

टिप 1: प्रारंभ संग्रह

class Post 
{ 
    public int Id { get; set; } 

    // Initialize to prevent NullReferenceException 
    public ICollection<Comment> Comments { get; } = new List<Comment>(); 
} 

class Comment 
{ 
    public int Id { get; set; } 
    public string User { get; set; } 

    public int PostId { get; set; } 
    public Post Post { get; set; }   
} 

टिप 2:HasOne और WithMany या HasMany और WithOne तरीकों का उपयोग कर बिल्ड

protected override void OnModelCreating(ModelBuilder model) 
{ 
    model.Entity<Post>() 
     .HasMany(p => p.Comments).WithOne(c => c.Post) 
     .HasForeignKey(c => c.PostId); 
} 

युक्ति 3: बेसब्री संग्रह लोड

var posts = db.Posts.Include(p => p.Comments); 

युक्ति 4: स्पष्ट रूप से लोड करता है, तो आप बेसब्री से

db.Comments.Where(c => c.PostId == post.Id).Load(); 
+0

धन्यवाद! इससे मेरा काम बनता है। लेकिन अब मेरे पास एक नया सवाल है, मुझे स्टैंडटार्ट प्रकारों के संग्रह के साथ क्या करने की ज़रूरत है, जैसे "सूची "? मैं InverseReference नहीं कर सकता, क्योंकि स्ट्रिंग में आपके उदाहरण में "c.Post" जैसी कोई संपत्ति नहीं है। इसे हल करने के लिए मैंने यह कोड लिखा: http://pastebin.com/3w7xCQ2k लेकिन क्या यह सही तरीका है? मैं इसे सरल कैसे बना सकता हूं? मैं वास्तव में इस तरह के smth का उपयोग करना चाहता हूं "सार्वजनिक ICollection टैग {get; set;} = नई सूची ();" – neonhash

+0

@neonhash वे वर्तमान में समर्थित नहीं हैं। आपको उन्हें एक इकाई प्रकार के अंदर लपेटना होगा। जैसे'वर्ग स्ट्रिंगवैल्यू {स्ट्रिंग वैल्यू {प्राप्त करें; सेट; }} ' – bricelam

+0

धन्यवाद कहने के लिए बस एक नोट, यह मुझे मिला है कि यह काम कैसे प्राप्त करने का सबसे स्पष्ट उदाहरण है। –

1

ऐसा लगता है कि Comments नेविगेशन संपत्ति ठीक से काम नहीं करती है। BlogPost को वास्तविक संदर्भ संदर्भ फ़ील्ड को PostComment तालिका में मॉडल करने का प्रयास करें। ईएफ नामकरण अनुपालन के लिए पोस्टकॉममेंट्स में नेविगेशन प्रॉपर्टी का भी नाम बदलें।

public class BlogPost 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DateTime DateTime { get; set; } 

    public int PosCommentId {get; set; } 
    public List<PostComment> PostComments { get; set; } 
} 

इस न काम करता है यदि आप स्वयं अपनी संबंधों को परिभाषित करने के लिए है, लेकिन इस में मदद करने से पहले, तो आप बेहतर अपने DB में इस दो तालिकाओं की स्कीमा प्रदान चाहते हैं।

अद्यतन 01:

पहले टिप: आप विलक्षण नामित तालिकाओं का उपयोग कर रहे हैं। यह ईएफ नामकरण सम्मेलन के अनुरूप नहीं है। बहुवचन को बंद करना होगा। बस इस लाइन को OnModelCreating विधि में रखें।

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

दूसरा टिप: मेरे पिछले सलाह पूरी तरह से गलत था अब यह विचार नहीं करते, बस अपने पुराने मॉडल स्कीमा का उपयोग करें।

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.Entity<PostComment>().HasRequired<BlogPost>(c => c.ParentPost) 
      .WithMany(p => p.Comments); 

    base.OnModelCreating(builder); 

} 

अधिक infos के लिए:

EF one-to-many relationship tutorial

Relationship and navigation properties

Configuring Relationships with the Fluent API

+0

यह मेरे लिए काम नहीं किया है। मैंने टिप्पणियाँ डीबीसेट जोड़ा और इस कोड का उपयोग किया: http://pastebin.com/5vFcJrZu, यह काम करता है, लेकिन क्या यह सही तरीका है? – neonhash

+0

क्या आप रिश्ते को मैन्युअल रूप से सेट करने का प्रयास कर रहे हैं? मुझे नहीं लगता कि यह निश्चित रूप से एक अच्छा विचार है। क्या आप इन दो तालिकाओं के लिए डीबी स्कीमा पोस्ट कर सकते हैं? –

+0

हां, मैं कर सकता था: pastebin.com/Ti6dUjEv – neonhash

0

बस पर नेविगेशन गुण @FabioCarello और @bricela से जवाब पर जोड़ने के लिए, मैं आभासी कीवर्ड का उपयोग करना चाहिये नहीं था:

public virtual ICollection<Comment> { get; set; } 

यह अनुमति देगा लेज़ी लोड हो रहा है, जिसका अर्थ है कि संग्रह/संदर्भ केवल पहले कॉल पर लोड किए जाएंगे और पहले डेटा पुनर्प्राप्ति के दौरान नहीं। यह बचने के लिए बहुत उपयोगी है, उदाहरण के लिए, रिकर्सिव संदर्भों पर ओवरफ्लो स्टैक करें।

नहीं Fluent सरल एक-से-कई रिश्तों आपके जैसे के लिए आवश्यक है, जब तक आप स्पष्ट गैर-व्यर्थ संदर्भ की आवश्यकता होती है जैसे गैर मानक व्यवहार की जरूरत है।

तुम भी विदेशी कुंजी जो उपयोगी है की स्पष्ट का उपयोग करता है बना सकते हैं ताकि आप माता-पिता लोड करने के लिए जब आप केवल अपने ईद की जरूरत नहीं है:

public class PostComment 
{ 
    public int Id { get; set; } 
    public BlogPost ParentPost { get; set; } 
    // // 
    public int? ParentPostId { get; set; } 
    // // 
    public string Content { get; set; } 
    public DateTime DateTime { get; set; } 
} 
+0

यह संभवतः डाउनवॉटेड (मेरे द्वारा नहीं) क्योंकि यह प्रश्न ईएफ 7 के बारे में है, जो [वर्तमान में आलसी का समर्थन नहीं करता है लोड हो रहा है] (https://github.com/aspnet/EntityFramework/issues/3312)। – Matt

संबंधित मुद्दे