Entity Framework обновляет контекст внешнего ключа.set

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня есть две таблицы Lesson и Group .

введите описание изображения здесь

У меня есть 4 урока и 2 группы, все уроки находятся в первой группе ( grp_Id=1 ).

Группа :

 public partial class Group:IEntity
{
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Group()
        {
            this.Lessons = new HashSet<Lesson>();
        }

        public int Id { get; set; }
        public Nullable<int> Ex_Id { get; set; }
        public string Name { get; set; }
        public Nullable<int> Factor { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Lesson> Lessons { get; set; }
        public EntityState EntityState { get; set; }
}
  

Урок:

 public partial class Lesson:IEntity
{
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Lesson()
        {
        }

        public int Id { get; set; }
        public Nullable<int> Grp_Id { get; set; }
        public string Name { get; set; }
        public Nullable<int> FromNum { get; set; }
        public Nullable<int> ToNum { get; set; }
        public Nullable<int> CountQuestio { get; set; }
        public Nullable<int> Factor { get; set; }

        public virtual Group Group { get; set; }

        public EntityState EntityState { get; set; }
}
  

Я использую это руководство для реализации n-уровневого уровня с помощью ссылки Entity Framework

Для сохранения и изменения я использую этот метод :

 public virtual void Update(params T[] items)
{
    using (var context = new AzmaEntities())
    {
        DbSet<T> dbSet = context.Set<T>();

        foreach (T item in items)
        {
            dbSet.Add(item);

            foreach(DbEntityEntry<IEntity> entry in context.ChangeTracker.Entries<IEntity>())
            {
                IEntity entity = entry.Entity;
                entry.State = GetEntityState(entity.EntityState);
            }
        }

        context.SaveChanges();
    }
} 
  

Это мой пример кода для обновления внешнего ключа и обновления урока; когда найдете урок с помощью Id=3 , измените группу и обновите Grp_Id :

 IGroupBLL grpbll = new GroupBLL();

IList<Group> grps = new List<Group>();
grps = grpbll.GetAllGroupWithLesson();

foreach (Group grp in grps)
{
    foreach (Lesson lsn in grp.Lessons)
    {
        if(lsn.Id == 3)
        {
            lsn.EntityState = EntityState.Modified;
            lsn.Grp_Id = 2;
            break;
        }
    }
}

grpbll.UpdateGroup(grps.ToArray());
  

Проблема:

перед запуском grpbll.UpdateGroup(grps.toArray()) измените grp_id на 2

введите описание изображения здесь

после запуска UpdateGroup запустите Update метод. В Update методе после выполнения приведенного ниже кода измените grp_Id на 1 (старый grp_Id был равен 1)

 DbSet<T> dbSet = context.Set<T>();

foreach (T item in items )
{
    dbSet.Add(item);

    foreach(DbEntityEntry<IEntity> entry in context.ChangeTracker.Entries<IEntity>())
    {
        IEntity entity = entry.Entity;
        entry.State = GetEntityState(entity.EntityState);
    }
}
  

Вопрос:

Как обновить внешний ключ в lesson ? Как изменить урок только в группе изменений grp_Id ?

Ответ №1:

Смотрите ссылку ниже http://www.entityframeworktutorial.net/EntityFramework4.3/add-one-to-many-entity-using-dbcontext.aspx

Вы должны внести некоторые изменения в свой код. Попробуйте

Комментарии:

1. это не решение. Я хочу использовать Update метод (написанный выше) для CRUD.