2011-08-04 49 views
1

我一直在使用EF Code First,SQL Express和ASP.Net MVC3進行實踐。實體框架代碼首先填充連接表

當我運行的網站第一次正確的表由FooInitializerStudentImage產生被填充,但因爲某些原因沒有被填充的連接表(StudentImages)。

可能是什麼問題?

表:StudentImage,並StudentImages

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Image> Images { get; set; } 
} 

public class Image 
{ 
    public int Id { get; set; } 
    public string Filename { get; set; } 
    public string Extension { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 

public class FooInitializer : DropCreateDatabaseIfModelChanges<DBContext> 
{ 

    protected override void Seed(DBContext context) 
    { 
    var students = new List<Student> { 
     new Student { Id = 1, Name = "John" }, 
     new Student { Id = 2, Name = "Jane" } 
    }; 

    students.ForEach(s => context.Students.Add(s)); 
    context.SaveChanges(); 


    var images = new List<Image> { 
    new Image { Id = 1, Filename = "IMG_4596.JPG", Extension = ".jpg" }, 
     new Image { Id = 2, Filename = "IMG_4600.JPG", Extension = ".jpg" } 
    }; 

    images.ForEach(i => context.Images.Add(i)); 

    students[0].Images.Add(images[0]); 
    context.SaveChanges(); 
    } 
} 
+0

現在想這些了 - 謝謝 –

回答

1

從我可以告訴你的Image類不具有對StudentID參考。嘗試添加:

public int StudentID { get; set; } 

到Image類可能?

還有一個ICollection將意味着一個圖像可能有多個學生 - 這是正確的嗎?也許這應該是一個公共的虛擬學生學生{...}

編輯:另外,我發現這一點,以多對多的關係(如果多數民衆贊成你的需要):

在你OnModelCreating()方法:

modelBuilder.Entity<Student>() 
    .HasMany(c => c.Images).WithMany(i => i.Students) 
    .Map(t => t.MapLeftKey("StudentId") 
     .MapRightKey("ImageID") 
     .ToTable("StudentImages")); 

this鏈接,國家採取:

講師和課程 實體之間的許多一對多的關係。該代碼指定加入 表的表名和列名。代碼優先可以在沒有此代碼的情況下爲您配置多對多關係 ,但如果您不調用它,則會爲InstructorID列獲取默認的 名稱,例如InstructorInstructorID。

編輯:這是我用過的晚上的代碼,我的執行代碼第一MVC網站:

每個實例化項目
var users = new List<User> 
      { 
       new User { UserID = new Guid(), Email = "[email protected]", LastOnline = DateTime.Now, Password = "pword", RegistrationDate = DateTime.Now, SecurityAnswer = "me", SecurityQuestion = "who?", Roles = new List<Role>() }, 
      }; 

      users.ForEach(s => context.Users.Add(s)); 
      context.SaveChanges(); 

      var roles = new List<Role> 
      { 
       new Role { RoleID = "Admin", Description = "Administration Users", Users = new List<User>() } 

      }; 
      roles.ForEach(r => context.Roles.Add(r)); 


      users[0].Roles.Add(roles[0]); 
      context.SaveChanges(); 



      var userLicense = new List<UserLicense> 
      { 
       new UserLicense { AddDateTime = DateTime.Now, LicenseType = "Farmer", Manufacturer = "Motorola", Model = "Droid", PhoneIdentifier = "c0e4223a910f", UserID = users[0].UserID, User = new User() } 

      }; 
      userLicense[0].User = users[0]; 
      userLicense.ForEach(u => context.UserLicenses.Add(u)); 
      context.SaveChanges(); 

      userLicense[0].User = users[0]; 
      context.SaveChanges(); 

通知,我也是實例中的一個新引用的項目父對象。

編輯:

好試試這個:

var students = new List<Student> { 
    new Student { Id = 1, Name = "John", Images = new List<Image>() }, 
    new Student { Id = 2, Name = "Jane", Images = new List<Image>() } 
}; 

students.ForEach(s => context.Students.Add(s)); 
context.SaveChanges(); 


var images = new List<Image> { 
    new Image { Id = 1, Filename = "IMG_4596.JPG", Extension = ".jpg", Students = new List<Student>() }, 
    new Image { Id = 2, Filename = "IMG_4600.JPG", Extension = ".jpg", Students = new List<Student>() } 
}; 

images.ForEach(i => context.Images.Add(i)); 

students[0].Images.Add(images[0]); 
students[1].Images.Add(images[1]); 
context.SaveChanges(); 
+0

我試圖取代的ICollection到學生學生,但加入沒有被不幸創建的表。 –

+0

使用代碼按照問題 - 添加上面的modelBuilder代碼,仍然沒有任何數據在連接表 –

+0

將嘗試以後更新的答案 –

0

嘗試保存爲每個學生修改前添加此:

foreach (Image i in s1.Images) 
    context.ObjectStateManager.ChangeObjectState(i, System.Data.EntityState.Added); 

還與System.Data.EntityState.Modified嘗試。

希望這個作品......

+0

似乎沒有任何影響 –