2016-07-11 3 views
2

새 응용 프로그램이 시작됩니다. 우리는 Entity Framework를 사용하고자합니다. 우리는 우연히 SQL 행을 삭제하는 것을 두려워하지 않습니다. 특히 우연히 관련 데이터를 설정하는 것이 좋습니다.엔티티 프레임 워크 : 전역 적으로 삭제 사용 안 함

모든 행을 "validUntil"열로 표시하고 결코 행을 삭제하지 않기 때문에 모든 삭제를 비활성화 할 것을 생각했습니다.

나는 that it can done by roles in sql을 보았지만 모든 논리와 제어가 코드에 포함되기를 바랍니다.

아마도 Entity Framework 코어에는이를 활성화하는 새로운 기능이 있습니까? 나는 그것이 여전히 EF로 행 sql을 작성할 수 있지만, 우리는 그런 경우를 두려워하지 않는다는 것을 안다.

나는 또한 좀 더 긴장을 풀기 위해 엔티티 관계의 설정자를 삭제하려고 시도했지만 EF의 일반적인 기능을 손상 시켰으며 좋은 생각처럼 보이지 않았습니다.

위의 링크에서 저장소 패턴을 사용하라는 권장 사항을 보았지만 here 좋은 습관이 아닌 것처럼 보입니다.

EF로 안전하게 작업하려면 어떻게해야합니까? 덕분에 !

답변

2

역할 옵션은 편도이지만 SaveChanges을 무시할 수도 있습니다. 당신이 모든 관계에 대한 삭제 동작을 변경하려면

, 다음 (OnModelCreating이 코드를 사용할 수 있습니다 :

public override int SaveChanges() 
{ 
    foreach (DbEntityEntry entity in this.ChangeTracker.Entries) 
    { 
     if (entity.State == System.Data.EntityState.Deleted) 
      return;   
    } 

    base.SaveChanges(); 
} 

편집

나는 EF Core에 대한 자식에 읽기 ...) 모델의 관계에 대해 일괄 적으로 설정하십시오.

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) 
{ 
    relationship.DeleteBehavior = DeleteBehavior.Restrict; 
} 
+0

작동하지 않습니다. 일대 다 구독에 대한 계정이 있습니다. account id == 13은 하나의 가입 (id == 5)을 갖습니다. 이제 var x = _context.Accounts.Include (b => b.Subscriptions)를 설정했습니다. 첫 번째 (a => a.AccountId == 13); 다음 x.Subscriptions = null; 오버라이드 저장 변경 상태 === 삭제 된 엔티티가 존재하지는 않지만 한 번 saveChanges 완료 됨 subscription id == 5 db에서 삭제됨 ... – arielorvits

+0

EF 6 또는 EF 코어를 사용하고 있습니까? –

+0

코어. 나는 삭제 캐스케이드를 엄격하게 변경 했으므로이 상황을 해결했습니다. – arielorvits

1

윌리엄의 대답은 거의 그것을 할 수있는 방법입니다,하지만 당신은 같은 것을 할 수 있습니다.

예외를 throw하도록 Delete를 설정하고 DeleteVirtual 메서드를 추가하십시오. 주로 이것은 또한 업데이트로, validUntil 필드를 업데이트하여 원하는 소프트 삭제를 수행 할 수 있습니다.

T IDbContext.Delete<T>(T entity) 
    { 
     throw new NotImplementedException(); 
    } 


    T IDbContext.DeleteVirtual<T>(T entity) 
    { 
     this.Entry(entity).State = EntityState.Modified; 
     return entity; 
    } 
1

당신은 DbContext 클래스 SaveChanges() 메소드를 오버라이드 (override) 할 수 있고 거기에 당신은 삭제 된 개체의 목록을 자신의 StatusUnchanged에 변경할 수 있습니다.

public override int SaveChanges() 
{ 
    var DeletedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Deleted).ToList(); 

    DeletedEntities.ForEach(E => 
    { 
     E.State = EntityState.Unchanged; 
    }); 

    return base.SaveChanges(); 
} 
+0

작동하지 않습니다. 일대 다 구독에 대한 계정이 있습니다. 계정 ID == 13은 하나의 가입 (ID == 5)을 갖습니다. 이제 var x = _context.Accounts.Include (b => b.구독). 첫 번째 (a => a.AccountId == 13); then x.Subscriptions = null; 재정의 변경 사항 저장 상태가 == 삭제 된 엔티티는 없지만 한 번 saveChanges 완료 구독 ID == 5 db에서 삭제됨 ... – arielorvits

관련 문제