Entity Framework Code First и заполнение таблиц соединений - PullRequest
1 голос
/ 05 августа 2011

Я практиковался с EF Code First, SQL Express и ASP.Net MVC3.

При первом запуске веб-сайта правильные таблицы генерируются FooInitializer, Student и Image.заполнены, но по какой-то причине таблица соединения (StudentImages) не заполняется.

В чем может быть проблема?

Таблицы: Student, Image и 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();
    }
}

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Из того, что я могу сказать, ваш класс Image не имеет ссылки на StudentID. Попробуйте добавить:

public int StudentID { get; set; } 

к классу изображений может быть?

Также наличие ICollection означало бы, что на одном изображении может быть несколько учеников - это правильно? Может быть, это должен быть публичный виртуальный Студенческий Студент {...}

РЕДАКТИРОВАТЬ: Кроме того, я нашел это, со многими ко многим (если это то, что вам нужно):

В вашем методе OnModelCreating ():

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

взято из этой ссылки, которая гласит:

Отношения «многие ко многим» между преподавателем и курсом юридические лица. Код задает имена таблиц и столбцов для объединения Таблица. Code First может настроить отношение «многие ко многим» для вас без этого кода, но если вы не позвоните, вы получите по умолчанию имена, такие как InstructorInstructorID для столбца InstructorID.

РЕДАКТИРОВАТЬ: Вот код, который я использовал вчера вечером, с моей реализацией кода для первого сайта MVC:

var users = new List<User> 
            {
                new User { UserID = new Guid(), Email = "me@me.com", 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();

Обратите внимание, что в каждом созданном элементе я также создаю экземпляр нового ссылочного элемента в родительском объекте.

EDIT:

Хорошо, попробуйте это:

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 голосов
/ 05 августа 2011

Попробуйте добавить это перед сохранением изменений для каждого учащегося:

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

Также попробуйте с System.Data.EntityState.Modified.

Надеюсь, это работает ...

...