Entity framework 캐스케이드 제거 고려 사항

5881 단어 framework
버전: EF6.0.1 RC
하위 객체 매핑에서 캐스케이드 삭제가 설정된 경우 상위 객체를 삭제하면 해당 하위 객체가 자동으로 삭제되므로 주의해야 할 사항이 있습니다.
부모 객체의 모든 자식 객체가 DbContext에 로드되었는지 확인해야 합니다.
DbContext에 하위 객체가 로드되지 않으면 하위 객체가 캐스케이드 없이 삭제됩니다(예제 코드 1).
예를 들어 DbContext는 부분자 대상만 불러오고, 이 하위 대상만 단계적으로 삭제합니다. (불러오지 않은 하위 대상은 누락됩니다.) (예시 코드 2를 보십시오.)
따라서 쿼리 부모 대상은 Include ('하위 대상 속성 이름') 쿼리 (예시 코드 3 참조) 를 사용하거나 DbContext에서 다른 하위 대상을 모두 쿼리해야 한다. (예시 코드 4 참조) 부모 대상을 삭제해야 하위 대상을 단계적으로 삭제할 수 있다.
 
코드 예:
DbContext 관련 구성 코드가 없는 주요 엔티티 및 프로세스 코드만 나열됩니다.
   //   
  public class Tb2Entity { public int Id { get; set; } public string Name { get; set; } public virtual IList<Item2Entity> Items { get; set; } }
// public class Item2Entity { public int Id { get; set; } public int? Pid { get; set; } public string Title { get; set; } public virtual Tb2Entity Parent { get; set; } }

예제 코드 1(올바르지 않음)
상위 객체만 삭제 하위 객체 삭제 누락
 var i = 15;
            using (var db1 = new Db1Context("db conn string"))
            {
                var tb1 = new Tb2Entity
                {
                    Id = i,
                    Name = "n1",
                    Items = new List<Item2Entity> { 
                     new Item2Entity{Id=1, Title="t1"},
                     new Item2Entity{Id=2, Title="t2"},
                     new Item2Entity{Id=3, Title="t3"}
                }
                };

                db1.Set<Tb2Entity>().Add(tb1);
                db1.SaveChanges();
            }

            Console.ReadKey();
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = db1.Set<Tb2Entity>().Find(i);

                db1.Set<Tb2Entity>().Remove(tb1);
                db1.SaveChanges();
            }

  
예제 코드 2 없음 (올바르지 않음)
부모 대상과 부분자 대상만 삭제(id=3의 하위 대상 삭제 누락)
            var i = 15;
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = new Tb2Entity
                {
                    Id = i,
                    Name = "n1",
                    Items = new List<Item2Entity> { 
                     new Item2Entity{Id=1, Title="t1"},
                     new Item2Entity{Id=2, Title="t2"},
                     new Item2Entity{Id=3, Title="t3"}
                }
                };

                db1.Set<Tb2Entity>().Add(tb1);
                db1.SaveChanges();
            }

            Console.ReadKey();
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = db1.Set<Tb2Entity>().Find(i);

                var item1 = db1.Set<Item2Entity>().Find(1);
                var item2 = db1.Set<Item2Entity>().Find(2);

                db1.Set<Tb2Entity>().Remove(tb1);
                db1.SaveChanges();
            }

  
예제 코드 3(정확)
상위 객체는 하위 객체와 함께 로드되고 캐스케이드 삭제 시 함께 삭제됩니다.
           var i = 15;
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = new Tb2Entity
                {
                    Id = i,
                    Name = "n1",
                    Items = new List<Item2Entity> { 
                     new Item2Entity{Id=1, Title="t1"},
                     new Item2Entity{Id=2, Title="t2"},
                     new Item2Entity{Id=3, Title="t3"}
                }
                };

                db1.Set<Tb2Entity>().Add(tb1);
                db1.SaveChanges();
            }

            Console.ReadKey();
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = db1.Set<Tb2Entity>()
                    .Include(m => m.Items) //         
                    .Where(m => m.Id == i).Take(1).SingleOrDefault();

                db1.Set<Tb2Entity>().Remove(tb1);
                db1.SaveChanges();
            }

예제 코드 4(정확)
하위 객체가 지연 시간에 로드되어 캐스케이드 삭제 시 함께 삭제됩니다.
 var i = 15;
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = new Tb2Entity
                {
                    Id = i,
                    Name = "n1",
                    Items = new List<Item2Entity> { 
                     new Item2Entity{Id=1, Title="t1"},
                     new Item2Entity{Id=2, Title="t2"},
                     new Item2Entity{Id=3, Title="t3"}
                }
                };

                db1.Set<Tb2Entity>().Add(tb1);
                db1.SaveChanges();
            }

            Console.ReadKey();
            using (var db1 = new Db1Context(Conns.db1))
            {
                var tb1 = db1.Set<Tb2Entity>().Find(i);

                //           
                if (tb1.Items != null)
                {                     
                }

                db1.Set<Tb2Entity>().Remove(tb1);
                db1.SaveChanges();
            }

좋은 웹페이지 즐겨찾기