문제

저장 메소드를 가로 채고, 일부 검증을 수행하고, 일부 속성을 변경 한 다음 다시 정상적으로 남겨 두어야합니다.

어떻게 할 수 있습니까?

감사! 알렉스

도움이 되었습니까?

해결책

실제 조치 전에 다음과 같은 부분 방법을 추가하는 것이 좋습니다.

OnSave(CancelEventArgs e); 
OnAdd(CancelEventArgs e); 
OnUpdate(CancelEventArgs e); 
OnDelete(CancelEventArgs e);

이것은 이벤트가 아니지만 어쨌든 CancelEventArgs를 사용합니다. 친절하고 사람들은 그것을 알고 있으며 그것을 사용하는 방법을 알고 실제 행동을 부분적 방법에서 취소 할 수 있습니다.

이 두 가지는 실제 조치 후에 발사되는 기존의 목록에 추가되어야합니다.

OnAdded(); 
OnUpdated();

onadded () 이름이 마음에 들지 않지만 삽입 대신 add가 채택되면이를 고수해야합니다.

그리고 그것이 ...이 부분적으로 우리는 실제 데이터 지속 메소드의 모든 Befores와 애프터를 다루고 있다고 생각합니다.

나는 이것을 구현할 수 있지만 향후 업데이트가 모든 사용자 정의 변경을 없애기 때문에 항상 TT 파일을 터치하는 것을 두려워합니다! :)

감사! 알렉스

다른 팁

2.X에는 이전 인수르트가 있었고 이전에 재정의 할 수있는 방법이있었습니다.

ActiveRecord.tt 파일에 onsaving 메소드를 추가해야한다고 생각합니다. onsaved () sig 옆에 이것을 배치하십시오.

  partial void OnSaving();

그런 다음 ActiveRecord.tt 파일을 업데이트하십시오. 내가 보는 2 가지 변경 사항 :

업데이트 방법을 업데이트하십시오

    public void Update(IDataProvider provider)
    {      
    <#if(tbl.Columns.Any(x=>x.Name=="ModifiedBy")){#>
        if(String.IsNullOrEmpty(this.ModifiedBy))
            this.ModifiedBy=Environment.UserName;
     <#}#>
    <#if(tbl.Columns.Any(x=>x.Name=="ModifiedOn")){#>
        this.ModifiedOn=DateTime.Now;
     <#}#>

       **OnSaving();**

        if(this._dirtyColumns.Count>0)
            _repo.Update(this,provider);
        OnSaved();
   }

그런 다음 추가 메소드를 업데이트하십시오

public void Add(IDataProvider provider)
{ 
<#if(tbl.Columns.Any(x=>x.Name=="CreatedOn")){#>

            this.CreatedOn=DateTime.Now;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="CreatedBy")){#>
            if(String.IsNullOrEmpty(this.CreatedBy))
                this.CreatedBy=Environment.UserName;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="ModifiedOn")){#>
            this.ModifiedOn=DateTime.Now;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="ModifiedBy")){#>
            if(String.IsNullOrEmpty(this.ModifiedBy))
                this.ModifiedBy=Environment.UserName;
<#}#>

            **OnSaving();**            

            var key=KeyValue();
            if(key==null){
                var newKey=_repo.Add(this,provider);
                this.SetKeyValue(newKey);
            }else{
                _repo.Add(this,provider);
            }
            SetIsNew(false);
            OnSaved();
}

마지막으로, 부분 클래스를 사용하여 onsaving () 메소드를 무시하려면 값을 업데이트해야합니다. 나는 ModifiedBy와 CreateDon의 컨벤션을 사용하지 않기 때문에 매우 비슷한 일을하고 있습니다 (밑줄이 있습니다).

부분 클래스 메커니즘을 사용하여 유효성 검사를 수행하고 Subsonic 생성 저장을 호출하는 Save의 저장 버전을 만들 수 있습니다. 예를 들어

namespace YourNameSpace
{
   public partial class YourTable : IActiveRecord
   { 
       public void MySave()
       {
           // insert your validation here
           this.Save()
       }
   }
}

각 ActiveRecord 클래스는 부분적인 "onsave ()"메소드와 함께 제공되므로 부분적으로 생성 한 다음 Linq에서 SQL에서와 같이 부분 onsave ()를 재정의하기 만하면됩니다.

public partial class MyClass{
   partial OnSave(){
   //magic
   }

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top