1

asp.net MVC 3 응용 프로그램에서 작업 중이며 codeFirst 방식을 사용하고 있습니다. 나는 역사 테이블이나 사용자 테이블을 만들려고하는데, 어디에서 사용자가 수정 한 컬럼인지 추적하고 싶습니다. 먼저 EF Code First를 사용하여이 작업을 수행 할 수 있습니다.Entity Framework 4.1을 사용하여 내역 테이블 만들기

DataContext.savechanges 이후에해야합니까?

좋습니다.

감사합니다.

+0

감사에 관한 흥미로운 게시물이 있습니다. [http://blogs.msdn.com/b/simonince/archive/2009/04/20/auditing-data-changes-in-the-entity-framework- part-2.aspx), 어떻게 생각하니? – ibiza

답변

1

DbContext은 Entry<T> 불리는 방법이 있습니다

var entity = context.Items.Find(id); 
entity.Name = "foobar"; 

var entry = context.Entry<Item>(entity); 

항목 DbEntityEntry<T> 형의 것 및 특성과 OriginalValuesCurrentValues있다.

이러한 속성을 일반적으로 검사하여 변경 내용을 확인한 다음 기록을 내 기록 테이블에 자동으로 삽입 할 수 있습니다.

또는 데이터베이스 트리거를 사용하십시오.

0

나는이 그것을 할 수있는 "appropiate"방법은 정말 잘 모르겠어요,하지만은 일반적으로 SQL에서 수행하는 방법입니다

  1. 는 int 형 또는 무언가의 추가 특성 version을 만듭니다.
  2. 매번 반복하지 않으려면 bool 유형의 다른 속성 IsLatestVersion을 추가하십시오.
  3. 엔티티가 저장되면 엔티티가 이미 있는지 확인하십시오. 그렇다면 IsLatestVersion = false에서 엔티티를 설정하십시오.
  4. version을 증가시키고 변경 사항을 새 엔티티로 저장하십시오.
+0

원 테이블과 다른 테이블을 생성하고 싶습니다. 사용자가 column1과 column5를 업데이트하면이 날짜에 열 1과 열 5가 수정 된 내역 테이블에 저장하려고합니다.이전 값을 저장하고 원본 테이블에서 새로운 값을 선택할 수 있습니다. EF를 사용하면 어떻게 할 수 있습니까? 나는 이런 것을 찾고있다. http://stackoverflow.com/questions/6689291/history-in-database-using-entity-framework – DotnetSparrow

0

ActionFilterAttribute에서 상속받은 필터를 원하는 것처럼 들리겠습니다. 제 경우에는 이것이 제가 가진 가장 간단한 예입니다. 이것은 내 모델이며, 속성이 데이터베이스에 대한 매핑을 지정한다는 점에 유의하십시오. 내 경우

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    public string UserName { get; set; } 
} 

은, 역사적 아니었지만, 다음처럼 간단했다 :

public sealed class UsersContext : DbContext 
{ 
    public UsersContext() : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
} 

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     LazyInitializer.EnsureInitialized(ref _initializer, ref isInitialized, ref initializerLock); 
    } 

     public void CheckDatabase() 
     { 
      Database.SetInitializer<YourDBContextType>(null); 

      using (var context = new YourDBContextType()) 
      { 
       if (!context.Database.Exists()) 
       { 
         ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
       } 
      } 

// Uses your connection string to build the following table. 
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
     } 

최종 결과는 EF되는 코드가 처음이 아니라도에 대한 모델을 가능하게 복잡한 엔티티에서 파생 된 프리미티브를 사용하도록 뷰를 수정하십시오. 자네가 다른 것을 가지고 있다면, 역사적으로 DBContext라고 말하면 텍스트 변환 파일을 수정하거나 엔티티의 기본 클래스를 만드는 것이 좋습니다. 두 가지 방법 모두 테이블에 삽입 할 수있는 코드를 쉽게 생성 할 수 있습니다. 그런 다음 해당 엔티티에 대한 후속 작업을 수행하여 기록 모델에 복제하고 저장합니다. 모든 것은 말했듯이, 나는 프레임 워크 대신에 제약 조건, 트리거 등에 집중하는 데이터베이스의 첫 번째 접근 방식에 대한 팬이다.

관련 문제