I came across an annoying issue with EPiServer media management related to versioning in EPiServer CMS from version 10 .0.1 onward.
Versioning in EPiserver for media content is supported and is a great feature. In CMS version 10 & 10.1 unfortunately due to a bug, the media items become inaccessible if republished the older version of the content.
Here is the scenario to reproduce this problem
1- Upload a pdf or image file in media folder though EPiServer CMS edit.
2- Upload another version of the file, the EPiServer ask to Replace file or Skip .. choose to replace.
3- Now you can access the new version of the file. (So far so good)
4- Go back to/ select old version of the file and republish it.
and
5- the file is inaccessible.
As shown in the screenshot below taken from CMS version 10, the download option is disappeared and in 10.0.1 the download option becomes grayed out.

No matter what I do now, I can't bring the links and versions back to life unless I upload the file with different name.
As shown in the screenshot below the physical files exists in the Assets folder and I can open them without any problem.

I tested the above scenario on EPiServer CMS 9.1 and 9.7 sites and it works perfectly. So I came to the conclusion that it’s a bug in EPiServer CMS 10 and I reported to EPiServer support.
Episerver Support provided me with the following SQL script for the bug fix and it's been later fixed in the next released version of EPiServer. As always it is recommended to make a backup of the database before applying any scripts.
or you can download the SQL script here
Problem
Versioning in EPiserver for media content is supported and is a great feature. In CMS version 10 & 10.1 unfortunately due to a bug, the media items become inaccessible if republished the older version of the content.
Here is the scenario to reproduce this problem
1- Upload a pdf or image file in media folder though EPiServer CMS edit.
2- Upload another version of the file, the EPiServer ask to Replace file or Skip .. choose to replace.
3- Now you can access the new version of the file. (So far so good)
4- Go back to/ select old version of the file and republish it.
and
5- the file is inaccessible.
As shown in the screenshot below taken from CMS version 10, the download option is disappeared and in 10.0.1 the download option becomes grayed out.

No matter what I do now, I can't bring the links and versions back to life unless I upload the file with different name.
As shown in the screenshot below the physical files exists in the Assets folder and I can open them without any problem.

I tested the above scenario on EPiServer CMS 9.1 and 9.7 sites and it works perfectly. So I came to the conclusion that it’s a bug in EPiServer CMS 10 and I reported to EPiServer support.
Solution
Episerver Support provided me with the following SQL script for the bug fix and it's been later fixed in the next released version of EPiServer. As always it is recommended to make a backup of the database before applying any scripts.
ALTER PROCEDURE [dbo].[editCreateContentVersion]
(
@ContentID INT,
@WorkContentID INT,
@UserName NVARCHAR(255),
@MaxVersions INT = NULL,
@SavedDate DATETIME,
@LanguageBranch NCHAR(17)
)
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
DECLARE @NewWorkContentID INT
DECLARE @DeleteWorkContentID INT
DECLARE @ObsoleteVersions INT
DECLARE @retval INT
DECLARE @IsMasterLang BIT
DECLARE @LangBranchID INT
SELECT @LangBranchID = pkID FROM tblLanguageBranch WHERE LanguageID=@LanguageBranch
IF @LangBranchID IS NULL
BEGIN
RAISERROR (N'editCreateContentVersion: LanguageBranchID is null, possibly empty table tblLanguageBranch', 16, 1, @WorkContentID)
RETURN 0
END
IF (@WorkContentID IS NULL OR @WorkContentID=0 )
BEGIN
/* If we have a published version use it, else the latest saved version */
IF EXISTS(SELECT * FROM tblContentLanguage WHERE Status = 4 AND fkContentID=@ContentID AND fkLanguageBranchID=@LangBranchID)
SELECT @WorkContentID=[Version] FROM tblContentLanguage WHERE fkContentID=@ContentID AND fkLanguageBranchID=@LangBranchID
ELSE
SELECT TOP 1 @WorkContentID=pkID FROM tblWorkContent WHERE fkContentID=@ContentID AND fkLanguageBranchID=@LangBranchID ORDER BY Saved DESC
END
IF EXISTS( SELECT * FROM tblContent WHERE pkID=@ContentID AND fkMasterLanguageBranchID IS NULL )
UPDATE tblContent SET fkMasterLanguageBranchID=@LangBranchID WHERE pkID=@ContentID
SELECT @IsMasterLang = CASE WHEN @LangBranchID=fkMasterLanguageBranchID THEN 1 ELSE 0 END FROM tblContent WHERE pkID=@ContentID
/* Create a new version of this content */
INSERT INTO tblWorkContent
(fkContentID,
fkMasterVersionID,
ChangedByName,
ContentLinkGUID,
fkFrameID,
ArchiveContentGUID,
Name,
LinkURL,
ExternalURL,
VisibleInMenu,
LinkType,
Created,
Saved,
StartPublish,
StopPublish,
ChildOrderRule,
PeerOrder,
fkLanguageBranchID,
URLSegment,
ThumbnailUri,
BlobUri)
SELECT
fkContentID,
@WorkContentID,
@UserName,
ContentLinkGUID,
fkFrameID,
ArchiveContentGUID,
Name,
LinkURL,
ExternalURL,
VisibleInMenu,
LinkType,
Created,
@SavedDate,
StartPublish,
StopPublish,
ChildOrderRule,
PeerOrder,
@LangBranchID,
URLSegment,
ThumbnailUri,
BlobUri
FROM
tblWorkContent
WHERE
pkID=@WorkContentID
IF (@@ROWCOUNT = 1)
BEGIN
/* Remember version number */
SET @NewWorkContentID= SCOPE_IDENTITY()
/* Copy all properties as well */
INSERT INTO tblWorkContentProperty
(fkPropertyDefinitionID,
fkWorkContentID,
ScopeName,
Boolean,
Number,
FloatNumber,
ContentType,
ContentLink,
Date,
String,
LongString,
LinkGuid)
SELECT
fkPropertyDefinitionID,
@NewWorkContentID,
ScopeName,
Boolean,
Number,
FloatNumber,
ContentType,
ContentLink,
Date,
String,
LongString,
LinkGuid
FROM
tblWorkContentProperty
INNER JOIN tblPropertyDefinition ON tblPropertyDefinition.pkID=tblWorkContentProperty.fkPropertyDefinitionID
WHERE
fkWorkContentID=@WorkContentID
AND (tblPropertyDefinition.LanguageSpecific>2 OR @IsMasterLang=1)--Only lang specific on non-master
/* Finally take care of categories */
INSERT INTO tblWorkContentCategory
(fkWorkContentID,
fkCategoryID,
CategoryType,
ScopeName)
SELECT
@NewWorkContentID,
fkCategoryID,
CategoryType,
ScopeName
FROM
tblWorkContentCategory
WHERE
fkWorkContentID=@WorkContentID
AND (CategoryType<>0 OR @IsMasterLang=1)--No content category on languages
END
ELSE
BEGIN
/* We did not have anything corresponding to the WorkContentID, create new work content from tblContent */
INSERT INTO tblWorkContent
(fkContentID,
ChangedByName,
ContentLinkGUID,
fkFrameID,
ArchiveContentGUID,
Name,
LinkURL,
ExternalURL,
VisibleInMenu,
LinkType,
Created,
Saved,
StartPublish,
StopPublish,
ChildOrderRule,
PeerOrder,
fkLanguageBranchID,
URLSegment,
ThumbnailUri,
BlobUri)
SELECT
@ContentID,
COALESCE(@UserName, tblContentLanguage.CreatorName),
tblContentLanguage.ContentLinkGUID,
tblContentLanguage.fkFrameID,
tblContent.ArchiveContentGUID,
tblContentLanguage.Name,
tblContentLanguage.LinkURL,
tblContentLanguage.ExternalURL,
tblContent.VisibleInMenu,
CASE tblContentLanguage.AutomaticLink
WHEN 1 THEN
(CASE
WHEN tblContentLanguage.ContentLinkGUID IS NULL THEN 0 /* EPnLinkNormal */
WHEN tblContentLanguage.FetchData=1 THEN 4 /* EPnLinkFetchdata */
ELSE 1 /* EPnLinkShortcut */
END)
ELSE
(CASE
WHEN tblContentLanguage.LinkURL=N'#' THEN 3 /* EPnLinkInactive */
ELSE 2 /* EPnLinkExternal */
END)
END AS LinkType ,
tblContentLanguage.Created,
@SavedDate,
tblContentLanguage.StartPublish,
tblContentLanguage.StopPublish,
tblContent.ChildOrderRule,
tblContent.PeerOrder,
@LangBranchID,
tblContentLanguage.URLSegment,
ThumbnailUri,
BlobUri
FROM tblContentLanguage
INNER JOIN tblContent ON tblContent.pkID=tblContentLanguage.fkContentID
WHERE
tblContentLanguage.fkContentID=@ContentID AND tblContentLanguage.fkLanguageBranchID=@LangBranchID
IF (@@ROWCOUNT = 1)
BEGIN
/* Remember version number */
SET @NewWorkContentID= SCOPE_IDENTITY()
/* Copy all non-dynamic properties as well */
INSERT INTO tblWorkContentProperty
(fkPropertyDefinitionID,
fkWorkContentID,
ScopeName,
Boolean,
Number,
FloatNumber,
ContentType,
ContentLink,
Date,
String,
LongString,
LinkGuid)
SELECT
P.fkPropertyDefinitionID,
@NewWorkContentID,
P.ScopeName,
P.Boolean,
P.Number,
P.FloatNumber,
P.ContentType,
P.ContentLink,
P.Date,
P.String,
P.LongString,
P.LinkGuid
FROM
tblContentProperty AS P
INNER JOIN
tblPropertyDefinition AS PD ON P.fkPropertyDefinitionID=PD.pkID
WHERE
P.fkContentID=@ContentID AND (PD.fkContentTypeID IS NOT NULL)
AND P.fkLanguageBranchID = @LangBranchID
AND (PD.LanguageSpecific>2 OR @IsMasterLang=1)--Only lang specific on non-master
/* Finally take care of categories */
INSERT INTO tblWorkContentCategory
(fkWorkContentID,
fkCategoryID,
CategoryType)
SELECT DISTINCT
@NewWorkContentID,
fkCategoryID,
CategoryType
FROM
tblContentCategory
LEFT JOIN
tblPropertyDefinition AS PD ON tblContentCategory.CategoryType = PD.pkID
WHERE
tblContentCategory.fkContentID=@ContentID
AND (PD.fkContentTypeID IS NOT NULL OR tblContentCategory.CategoryType = 0) --Not dynamic properties
AND (PD.LanguageSpecific=1 OR @IsMasterLang=1) --No content category on languages
END
ELSE
BEGIN
RAISERROR (N'Failed to create new version for content %d', 16, 1, @ContentID)
RETURN 0
END
END
/*If there is no version set for tblContentLanguage set it to this version*/
UPDATE tblContentLanguage SET Version = @NewWorkContentID
WHERE fkContentID = @ContentID AND fkLanguageBranchID = @LangBranchID AND Version IS NULL
RETURN @NewWorkContentID
END
or you can download the SQL script here
0 comments :
Post a Comment