2013-10-28 30 views
19

EF'de bir test yapmayı deniyorum, çoktan fazla ilişki oluşturuyorum, çünkü her zaman Birebir veya Biri ile Çok - Eşleştirdiğimden, İnternette bir örnek alıyorum deneme için, örneğin insert kayıtları için çalıştığını amaVarlık çerçeve kodunda birçok ilişkiye eşleme ilk olarak

İşte

Ben sitede

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public ICollection<Course> CoursesAttending { get; set; } 

    public Person() 
    { 
     CoursesAttending = new HashSet<Course>(); 
    } 
} 

public class Course 
{ 
    public int CourseId { get; set; } 
    public string Title { get; set; } 

    public ICollection<Person> Students { get; set; } 

    public Course() 
    { 
     Students = new HashSet<Person>(); 
    } 
} 

bu kodu almak, ben HashSet olduğunu bilmiyorum, benim sınıfları olduğunu kayıtlarını okuyamaz İşte benim Bağlamım

public class SchoolContext : DbContext 
{ 
    public DbSet<Course> Courses { get; set; } 
    public DbSet<Person> People { get; set; } 

    public SchoolContext() 
     : base("MyDb") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Course>(). 
      HasMany(c => c.Students). 
      WithMany(p => p.CoursesAttending). 
      Map(
       m => 
       { 
        m.MapLeftKey("CourseId"); 
        m.MapRightKey("PersonId"); 
        m.ToTable("PersonCourses"); 
       }); 

    } 
} 

Ben kayıtlarını eklemek

sağ
static void Main(string[] args) 
{ 
    using (SchoolContext db = new SchoolContext()) 
    { 
     Course math = new Course(); 
     Course history = new Course(); 
     Course biology = new Course(); 
     math.Title = "Math"; 
     history.Title = "History"; 
     biology.Title = "Biology"; 

     db.Courses.Add(math); 
     db.Courses.Add(history); 
     db.Courses.Add(biology); 

     Person john = new Person(); 
     john.FirstName = "John"; 
     john.LastName = "Paul"; 
     john.CoursesAttending.Add(history); 
     john.CoursesAttending.Add(biology); 

     db.People.Add(john); 
     db.SaveChanges(); 
    } 
} 

Ama gösteri içerik seçme kayıt çalıştığınızda, işe değil, sadece bir şey

static void Main(string[] args) 
{ 
    using (SchoolContext db = new SchoolContext()) 
    { 
     Pearson p = db.Peasons.First(); 
     Console.WriteLine(p.CoursesAttending.First().Title); 
    } 
} 
ben veritabanında kontrol ettirdik

yazdırmak olduğunu kayıtları mevcuttur, sorun nedir?

Lütfen önce kodla birçok ilişkide nasıl seçim yapacağımı öğrenin.

+0

Çoktan çoğa ilişkisi içinde gezinme özellikleri üzerinde '.Add()' işlevini kullanırsanız, EF otomatik olarak karşılık gelen bir ortak tabloyu güncelleştirir mi? – Celdor

+0

@Celdor EF, karşılık gelen birleştirme tablosunu güncelleştirir. – IFink

cevap

33
Öncelikle, koleksiyonları sanal yaparak tembel yükleme etkinleştirmek isteyebilirsiniz

: Bu EF ile koleksiyonlarını geçersiz türetilmiş sınıfları Course den (vekiller) ve Person oluşturmanızı sağlar

public virtual ICollection<Course> CoursesAttending { get; set; } 
public virtual ICollection<Person> Students { get; set; } 

Verilerini veri deposundan yüklemek için mantık.

Eğer

Console.WriteLine(p.CoursesAttending.First().Title); 

CoursesAttending doldurmak için ayrı bir sorgu yürütmek göreceksiniz bunu yaparken.

Alternatif ya da ek olarak, bu kadar gibi istekli yükleme tarafından veritabanına yuvarlak gezileri önlemek için karar verebilir: tek atışta PersonveCoursesAttending yükler

Person p = db.Persons.Include(p => p.CoursesAttending).First(); 

.

+0

Harika! bu iş! Peki ... Include hızlı seçim için neden kullanıyor? İçindekileri nasıl kullanacağımı anlamıyorum – Lai32290

+1

Kelimenin söylediğine göre, "Dahil et" sorgusuna ait özellikleri içerir. Genellikle bir SQL sorgusu (birleştirme ile) nesneler almaktan ve ilişkili nesnelerini daha sonra ayrı sorgularda sorgulamaktan daha etkilidir. –

-1

Sınıf yapıcınızı ve bu OnModelCreating yöntemini kaldırın. EF, birçok ila çok ilişkiyi kullanır. Ekstra bir şey yapmanıza gerek yok.

+6

Veri notlarını kullanmak, varsayılan olarak size bir funky adlandırma kuralı verebilir ve akıcı api kodunu sağlayarak bu istenmeyen adlandırma önlenebilir. –

+0

Bu cevap IMO OT ve hiç de yararlı değil. – Celdor

İlgili konular