Entity framework 캐스케이드 제거 고려 사항
5881 단어 framework
하위 객체 매핑에서 캐스케이드 삭제가 설정된 경우 상위 객체를 삭제하면 해당 하위 객체가 자동으로 삭제되므로 주의해야 할 사항이 있습니다.
부모 객체의 모든 자식 객체가 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();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fragmenta의 각서라고 할까, 그것 밖에 발견되지 않았기 때문에 시도해보기로 했습니다. 다만, 내용을 보면 어플리케이션을 만드는 프레임워크로서 사용되는 것도 의식하고 있는 것 같습니다. 하지만, 지금은 정확하지 않은 것 같기 때문에,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.