나는 또한 비슷한 문제에 직면했다. 매번 워크 플로우 설계가 바뀌어 DB의 모든 이전 워크 플로우 인스턴스가 오류를 던진다.
이 문제를 해결하기 위해 각 워크 플로 유형에 대한 추적 프로필을 만들었습니다. 워크 플로를 변경 한 경우 내 프로필 버전을 업데이트했습니다. 이것은 나를 위해 일했습니다. 여기에 샘플 코드가 있습니다 -
이 경우 워크 플로우 런타임에 추적 서비스를 추가해야합니다.
TrackingProfile profile = CreateProfile();
StoreProfileToDB (프로필, connString, typeof (ExceptionWF.ParameterExceptionWF), "2.0.0.0");
개인 정적 TrackingProfile CreateProfile() { TrackingProfile myProfile = new TrackingProfile();
ActivityTrackingLocation stateActivityLocation = CreateActivityLocation(typeof(StateActivity));
AddActivityExecutionStatus(stateActivityLocation);
ActivityTrackingLocation eventDrivenActLoc = CreateActivityLocation(typeof(EventDrivenActivity));
AddActivityExecutionStatus(eventDrivenActLoc);
ActivityTrackPoint actPt = new ActivityTrackPoint();
actPt.MatchingLocations.Add(stateActivityLocation);
actPt.MatchingLocations.Add(eventDrivenActLoc);
myProfile.ActivityTrackPoints.Add(actPt);
WorkflowTrackPoint workflowTrack = CreateWorkflowTrackPoint();
myProfile.WorkflowTrackPoints.Add(workflowTrack);
UserTrackPoint utp = new UserTrackPoint();
UserTrackingLocation ul = new UserTrackingLocation();
ul.ActivityType = typeof(HandleExternalEventActivity);
ul.ArgumentType = typeof(object);
ul.MatchDerivedArgumentTypes = true;
ul.MatchDerivedActivityTypes = true;
utp.MatchingLocations.Add(ul);
myProfile.UserTrackPoints.Add(utp);
myProfile.Version = new Version("1.0.0.0");
return myProfile;
}
private static void StoreProfileToDB(TrackingProfile profile, string connString, Type wfType,string version)
{
TrackingProfileSerializer serializer = new TrackingProfileSerializer();
System.IO.StringWriter writer = new System.IO.StringWriter(new StringBuilder());
serializer.Serialize(writer, profile);
SqlConnection conn = null;
try
{
if (!String.IsNullOrEmpty(connString))
{
conn = new SqlConnection(connString);
string storedProc = "dbo.UpdateTrackingProfile";
SqlCommand cmd = new SqlCommand(storedProc, conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@TypeFullName", SqlDbType.NVarChar, 128);
param.Direction = ParameterDirection.Input;
param.Value = wfType.FullName;
cmd.Parameters.Add(param);
param = new SqlParameter("@AssemblyFullName", SqlDbType.NVarChar, 256);
param.Direction = ParameterDirection.Input;
param.Value = wfType.Assembly.FullName;
cmd.Parameters.Add(param);
param = new SqlParameter("@Version", SqlDbType.VarChar, 32);
param.Direction = ParameterDirection.Input;
//Note that you should increment version number for your
//TrackingProfile to be able to use new TrackingProfile.
//Default version is "1.0.0.0, It uses the default profile if not increamented.
param.Value = version;
cmd.Parameters.Add(param);
param = new SqlParameter("@TrackingProfileXml", SqlDbType.NText);
param.Direction = ParameterDirection.Input;
param.Value = writer.ToString();
cmd.Parameters.Add(param);
conn.Open();
cmd.ExecuteNonQuery();
}//if
}// try
catch (Exception ex)
{
if (ex is SqlException)
{
//Check to see if it's a version error
if (ex.Message.Substring(0, 24) == "A version already exists")
{
EventLogger.Log("A profile with the same version already exists in database");
}//if
else
{
EventLogger.Log("Error writing profile to database : " + ex.ToString());
}
}
else
{
EventLogger.Log("Error writing profile to database : " + ex.ToString());
}
}
finally
{
if (conn != null) { conn.Close(); }
}
}
출처
2009-07-17 07:00:33
ksa
또한 프로필은 전역 어셈블리 캐시에 여러 워크 플로 버전을로드하는 옵션입니다. 좋은 소식은 이것이 .NET4.0에서는 문제가되지 않는다는 것입니다. 4의 나쁜 소식은 언젠가 내년에 나올 예정입니다. – ahsteele
@ksa - 수동으로 버전 번호를 늘리시겠습니까? 즉, 다시 컴파일하기 전에 워크 플로를 변경하면 소스 코드의 버전 번호가 올라갑니다. 나는 데이터베이스에서 추적 프로필을 비교하여 방금 만든 프로필과 비교해 보았습니다. 프로필이 다르면 버전을 늘리 겠지만 데이터베이스 오류가 계속 발생했습니다. 해결. @ahsteele - 나는 이것을 시도했지만 다시 실패했습니다 ... 지난주에 많은 승리를 얻지 못했습니다! 다시 시도 할 것입니다. :-) –
프로필 버전을 변경 한 후에 DB를 "업데이트"하시겠습니까? 그렇다면이 문제를 말하십시오. DB의 이전 워크 플로 인스턴스에는 이전 프로필 버전이 필요합니다. 워크 플로우 디자인을 변경하면 코드에서 프로파일 버전을 업데이트하면됩니다 (u가 설계 또는 워크 플로우 코드를 변경했기 때문에). 이제 Db는 동일한 워크 플로 유형의 버전을 프로파일 링해야합니다. 희망이 도움이됩니다. – ksa