Как правильно использовать ChangeTracker.Entries <Entity>в Entity Framework Code First - PullRequest
0 голосов
/ 26 декабря 2011

это мой простой класс наследования DbContext:

public class School : DbContext
{
    public DbSet<Activity> Activity { get; set; }
    public DbSet<Student> Student { get; set; }

    public override int SaveChanges()
    {
        string s = string.Empty;
        foreach (var entry in ChangeTracker.Entries<Activity>().Where(a => a.State != EntityState.Unchanged))
            s = entry.State.ToString();

        foreach (var entry in ChangeTracker.Entries<Student>().Where(a => a.State != EntityState.Unchanged))

            s = entry.State.ToString();
        return base.SaveChanges();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Configuration.ValidateOnSaveEnabled = false;
        Configuration.LazyLoadingEnabled = true;

        base.OnModelCreating(modelBuilder);
    }
}

это мои объекты:

 public class Student
{
    public int id { get; set; }
    public string Name { get; set; }
    public string Roll { get; set; }

    //naviagtional property
    public virtual IList<Activity> Activities { get; set; }
}


 public class Activity
{
    public int id { get; set; }
    public double Maths { get; set; }
    public double Science { get; set; }
    public double History { get; set; }

    //navigational property
    public virtual Student Student { get; set; }

}

где-то в моем коде я делаю это:

       int studentId = Convert.ToInt32(Request.Form["Student.id"]);
        Activity activity = dbContext.Activity.Where(e => e.Student.id == studentId).Single();
        activity.Student.Name = Request.Form["Student.Name"];
        activity.Student.Roll = Request.Form["Student.Roll"];
        activity.Maths = Convert.ToDouble(Request.Form["Maths"]);
        activity.Science = Convert.ToDouble(Request.Form["Science"]);
        dbContext.SaveChanges();

Все нормально и нормально и работает как надо.Мой вопрос, обновляя Activity.Student.Name, как я могу обнаружить изменения в сущности Activity, а не в сущности Student?Есть ли какая-либо поддержка в Entity Framework для обнаружения изменений в родительской таблице (а не в ведомой таблице, где происходят реальные изменения).Пожалуйста, помогите, это сэкономит мне много времени ..

1 Ответ

0 голосов
/ 09 июня 2014

Несмотря на то, что это старый вопрос, я думал, что все равно дам ответ. НЕТ, вы не можете .

. Причина этого в том, что вы, программист, в курсе примера кода знаете, что происходит, и можете действовать в соответствии с этим (до выполнения SaveChanges)убедитесь, что все, что вы хотите, случится.Учащийся, которого вы меняете, также может быть частью других организаций, поэтому вы также хотите, чтобы эти организации были уведомлены.Автоматическое поведение, как вы предлагаете, приведет к тому, что очень сложные уведомления начнут отправляться через модель, что (в большинстве случаев нежелательно).Как @Ladislav Mrnka также указал, что вы изменили не активность, а учащийся, участвующий в активности.Если отношения со студентами - это не просто поиск, возможно, модель следует изменить.Сформируйте пример кода, учитывая, что трудно понять, «почему» вам нужно было бы обнаружить изменения, сделанные «через» другие объекты

...