2011-08-12 2 views
10

일부 EF 개체의 삽입 및 업데이트 이벤트에 일부 논리를 추가하고 싶습니다. name 속성의 slugified 버전 인 속성을 가진 category 객체가있는 MVC 응용 프로그램이 있습니다.EF 코드의 삽입/업데이트 논리에서 처음으로

public class Category 
{ 

    public string Name { get; set; } 
    public string UrlName{ get; set; } 
} 

내 slugify 논리가 매우 정교하기 때문에 삽입 및 업데이트 이벤트에만 UrlName 속성을 설정하고 싶습니다.

문맥 자체에 SaveChanges() 함수 내에서 일부 논리를 추가 할 수 있다는 것을 알고 있지만 오히려 엔티티 자체에 코드를 가까이두고 싶습니다.

먼저 EF 코드를 사용하여 이러한 작업을 수행 할 수 있습니까?

답변

21

당신은 방법과 기본 클래스가 설치 삽입 전에 호출하고 업데이트 할 수 있습니다 DbContext

public override int SaveChanges() 
    { 
     var changedEntities = ChangeTracker.Entries(); 

     foreach (var changedEntity in changedEntities) 
     { 
      if (changedEntity.Entity is Entity) 
      { 
       var entity = (Entity)changedEntity.Entity; 

       switch (changedEntity.State) 
       { 
        case EntityState.Added: 
         entity.OnBeforeInsert(); 
         break; 

        case EntityState.Modified: 
         entity.OnBeforeUpdate(); 
         break; 

       } 
      } 
     } 

     return base.SaveChanges(); 
    } 
+1

는 상속을 강제로이 나쁜 솔루션에서 다음

public abstract class Entity { public virtual void OnBeforeInsert(){} public virtual void OnBeforeUpdate(){} } public class Category : Entity { public string Name { get; set; } public string UrlName{ get; set; } public override void OnBeforeInsert() { //ur logic } } 

. 더 나은 방법은 인터페이스를 사용하는 것입니다. – Migol

+1

@Migol 대답은 ​​콜백 메커니즘을 구현하는 방법을 보여줍니다. 그것을 구현하는 방법은 당신에게 달려 있습니다. – Eranga

+1

@Migol, 인터페이스를 사용하면 메서드를 강제로 구현하므로 그의 대답이 좋습니다. – orourkedd

1

아니요 엔티티가 POCO이므로 해당 확장 점이 없습니다. 지속성을 인식하지 못합니다. 이러한 논리는 지속성을 알고있는 데이터 액세스 계층에서 트리거되어야합니다. DbContext API는 SaveChanges의 재정의 만 제공합니다.

엔터티에 사용자 지정 이벤트 또는 메서드를 노출시키고 처리 중에 SaveChanges에 호출 할 수 있습니다.

관련 문제