Save 메서드를 가로 채서 몇 가지 유효성 검사를 수행하고 일부 속성을 변경 한 다음 정상적으로 다시 보냅니다.ActiveRecord에서 save 메소드를 인터셉트하는 방법은 무엇입니까?
어떻게하면됩니까?
감사합니다. Alex
Save 메서드를 가로 채서 몇 가지 유효성 검사를 수행하고 일부 속성을 변경 한 다음 정상적으로 다시 보냅니다.ActiveRecord에서 save 메소드를 인터셉트하는 방법은 무엇입니까?
어떻게하면됩니까?
감사합니다. Alex
이 실제 행동 이전에 해고 될 :
OnSave(CancelEventArgs e);
OnAdd(CancelEventArgs e);
OnUpdate(CancelEventArgs e);
OnDelete(CancelEventArgs e);
이 이벤트는 아니지만 어쨌든 CancelEventArgs을 사용, 그것은 사람들이 알고 K, 친절 이제 그것을 사용하는 방법 및 실제 작업을 부분적인 방법으로 취소 할 수 있습니다.
이 두 실제 작업 후 발사 기존의 것들의 목록도 추가해야합니다
OnAdded();
OnUpdated();
내가 좋아하지 않는 OnAdded() 이름 만 추가는 다음 삽입 대신 채택 된 경우 우리는 그것에 충실해야합니다.
그리고 그 부분은 다음과 같습니다. 실제 데이터 지속성 방법의 경이로움을 모두 커버하여 데이터를 원하는대로 처리 할 수있는 유연성을 제공합니다.
이 기능을 구현할 수 있지만 이후 업데이트가 내 모든 사용자 정의 변경 사항을 지울 예정이므로 항상 tt 파일을 두려워합니다! :)
고마워요! Alex
유효성 검사를 수행하고 SubSonic에서 생성 한 저장을 호출하는 사용자 지정 저장 버전을 만들기 위해 부분 클래스 메커니즘을 사용할 수 있습니다. 예 :
namespace YourNameSpace
{
public partial class YourTable : IActiveRecord
{
public void MySave()
{
// insert your validation here
this.Save()
}
}
}
안녕 친구, 답장을 보내 주셔서 감사합니다. 사용자 지정 저장을 잊어 버리고 ActiveRecord 기본값을 사용하는 것이 쉽기 때문에 이것은 실제로 좋은 옵션이 아닙니다. 과부하가 필요하지 않습니다. OnSave (개체 발신자, CancelEventArgs e)와 같은 방법이 필요합니다. 사용중인 저장 오버로드와 별도로 저장 프로세스의 유효성을 검사, 변경 또는 취소 할 수 있습니다. 내가 누락 될 수 있기 때문에 나는 묻고 있었다. 그렇지 않으면 나는 나 자신을 구현해야 할 것이다. – AlexCode
각 액티브 클래스 ") 된 OnSave ("부분과 함께 제공 방법 그래서 당신이) 부분을 작성하면된다 다음 (부분 된 OnSave을 무시하는 데 필요한 모든 - 단지 Linq에처럼 SQL로 :
public partial class MyClass{
partial OnSave(){
//magic
}
}
나는 다음과 같은 부분적인 방법을 추가하는 것이 좋습니다 것입니다
2.x에는 재정의 할 수있는 BeforeInsert 및 BeforeUpdate 메서드가있었습니다.
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 (나는 거기에 밑줄이있다)의 관습을 사용하지 않기 때문에 나는 아주 비슷한 것을하고있다.
예 ... 거의 다 됐습니다. 차후 아음속 tt 업데이트가 "두려워"하기 때문에 아직 완료하지 못했습니다. 맞춤 변경 사항은 어떻게 처리합니까? 또 다른 것은 실제 작업 전에 변경 사항을 취소 할 수 있어야합니다. 따라서 On * 메서드에 CancelEventArgs가 필요합니다. – AlexCode
정말 선택의 여지가 없습니다. 필요한 경우 tt 파일을 편집해야합니다. OnSaving이 추가 된 것을보고 싶습니다. 기본 템플릿도 마찬가지입니다 (이전 버전과 비슷한 것이므로 승인 될 가능성이 있습니다.) SubSonic github 사이트 (subsonic-3/templates 프로젝트 아래)에서 문제를 게시 할 수 있습니다. 이후 버전에서 추가되었습니다 .tt 파일을 편집하는 것을 좋아하지 않습니다 (가능한 경우 부분 클래스를 만드는 데 전념하고 싶습니다).하지만 작업이 필요할 경우에는해야합니다. –
취소해야하기 때문에 Validate 메소드를 찾았습니까? 그것은 2.x에 존재 했었고 Insert/Update 명령이 시작되기 전에 호출 된 것 같습니다. 삽입/업데이트를 무효로 설정하여 취소 할 수있는 방법이 있다고 생각합니다. 나는 3을 처음 사용하기 때문에 이전 릴리스 만 가지고 비교할 수 있습니다. –
ActiveRecord는 꽤 "일반적인"헤더입니다.O/RM 라이브러리에는이 단어를 사용하는 것이 훨씬 더 널리 사용되고 있습니다. "액티브 레코드 (ActiveRecord)"는 아마도 그 이름을 지은 몇 년 전에 만들어진 디자인 패턴 마틴 파울러 (Martin Fowler) 때문일 것입니다. 그래서 사람들이 그것을 이해할 수 있도록 게시물에 태그를 붙이더라도 Subsonic에 대해 이야기하고 있습니다. 더 정확하게 Subsonic을 헤더에 추가하는 것입니다. –
당신은 맞습니다 ... "일반" 환경 stackoverflow입니다. 다시는 발생하지 않습니다 :) – AlexCode