From 04a2e0c3c36c07a2dd817f6877360e06d117e760 Mon Sep 17 00:00:00 2001 From: khavas Date: Wed, 19 May 2010 15:12:05 -0700 Subject: [PATCH] MetaData Review Changes --HG-- branch : dev --- .../ContentTypeMetaDataTests.cs | 1 + .../ContentManagement/DatabaseSetup.cs | 25 --------- .../Orchard.Framework.Tests.csproj | 3 -- .../Modules/Orchard.MetaData/AdminMenu.cs | 8 +-- .../Controllers/MetaDataController.cs | 47 ++++++++-------- .../Modules/Orchard.MetaData/Permissions.cs | 32 ----------- .../Properties/AssemblyInfo.cs | 1 - .../Views/MetaData/ContentTypeList.ascx | 10 ++-- .../Orchard.Setup/Services/SetupService.cs | 3 -- .../Drivers/ContentPartDriver.cs | 2 +- .../MetaData/ContentPartHandler.cs | 6 ++- .../MetaData/ContentPartInfo.cs | 4 +- .../MetaData/Models/ContentTypePart.cs | 11 ---- .../MetaData/Records/ContentTypePartRecord.cs | 2 +- .../MetaData/Services/ContentTypeService.cs | 54 ++++++++++--------- .../MetaData/Services/IContentTypeService.cs | 1 + .../Records/ContentPartRecord.cs | 3 ++ src/Orchard/Orchard.Framework.csproj | 4 +- 18 files changed, 78 insertions(+), 139 deletions(-) delete mode 100644 src/Orchard.Tests/ContentManagement/DatabaseSetup.cs delete mode 100644 src/Orchard/ContentManagement/MetaData/Models/ContentTypePart.cs diff --git a/src/Orchard.Tests/ContentManagement/ContentTypeMetaDataTests.cs b/src/Orchard.Tests/ContentManagement/ContentTypeMetaDataTests.cs index dc2853d13..ce2649630 100644 --- a/src/Orchard.Tests/ContentManagement/ContentTypeMetaDataTests.cs +++ b/src/Orchard.Tests/ContentManagement/ContentTypeMetaDataTests.cs @@ -25,6 +25,7 @@ namespace Orchard.Tests.ContentManagement{ typeof(ContentTypeRecord), typeof(ContentItemRecord), typeof(ContentTypePartRecord), + typeof(ContentTypePartNameRecord), typeof(ContentItemVersionRecord)); } diff --git a/src/Orchard.Tests/ContentManagement/DatabaseSetup.cs b/src/Orchard.Tests/ContentManagement/DatabaseSetup.cs deleted file mode 100644 index a57aaa6b9..000000000 --- a/src/Orchard.Tests/ContentManagement/DatabaseSetup.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Configuration; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Microsoft.VisualStudio.TeamSystem.Data.UnitTesting; - -namespace Orchard.Tests.ContentManagement -{ - [TestClass()] - public class DatabaseSetup - { - - [AssemblyInitialize()] - public static void IntializeAssembly(TestContext ctx) - { - // Setup the test database based on setting in the - // configuration file - DatabaseTestClass.TestService.DeployDatabaseProject(); - DatabaseTestClass.TestService.GenerateData(); - } - - } -} diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 756c40f2f..5eda30e2e 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -64,8 +64,6 @@ False ..\..\lib\machine.migrations\Machine.Migrations.NHibernate.dll - - False ..\..\lib\moq\Moq.dll @@ -136,7 +134,6 @@ Code - Code diff --git a/src/Orchard.Web/Modules/Orchard.MetaData/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.MetaData/AdminMenu.cs index 96d27c343..ad2c436d5 100644 --- a/src/Orchard.Web/Modules/Orchard.MetaData/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.MetaData/AdminMenu.cs @@ -1,14 +1,8 @@ -using System.Linq; - + using Orchard.UI.Navigation; namespace Orchard.MetaData { public class AdminMenu : INavigationProvider { - //private readonly IBlogService _blogService; - - public AdminMenu() { - //_blogService = blogService; - } public string MenuName { get { return "admin"; } } diff --git a/src/Orchard.Web/Modules/Orchard.MetaData/Controllers/MetaDataController.cs b/src/Orchard.Web/Modules/Orchard.MetaData/Controllers/MetaDataController.cs index 18a1e7f2c..dee0f6eec 100644 --- a/src/Orchard.Web/Modules/Orchard.MetaData/Controllers/MetaDataController.cs +++ b/src/Orchard.Web/Modules/Orchard.MetaData/Controllers/MetaDataController.cs @@ -1,41 +1,46 @@ using System.Web.Mvc; using Orchard.ContentManagement.MetaData.Services; -using Orchard.Themes; -using Orchard.Data; -using Orchard.ContentManagement.Records; -using Orchard.ContentManagement.MetaData.Records; +using Orchard.Localization; using Orchard.MetaData.ViewModels; +using Orchard.UI.Admin; namespace Orchard.MetaData.Controllers { - [Themed] + [Admin] public class MetaDataController : Controller { - private readonly IRepository _ctps; private readonly IContentTypeService _contentTypeService; + public IOrchardServices Services { get; set; } - public MetaDataController(IRepository ctps, IContentTypeService contentTypeService){ - _ctps = ctps; + public MetaDataController(IOrchardServices services, IContentTypeService contentTypeService) + { _contentTypeService = contentTypeService; + Services = services; + T = NullLocalizer.Instance; } + private Localizer T { get; set; } // // GET: /ContentTypeList/ public ActionResult ContentTypeList(string id) { + + if (!Services.Authorizer.Authorize(Permissions.ManageMetaData, T("Not allowed to manage MetaData"))) + return new HttpUnauthorizedResult(); + var contentTypes = _contentTypeService.GetContentTypes(); var contentTypePartNames = _contentTypeService.GetContentTypePartNames(); var model = new ContentTypesIndexViewModel(); - foreach(ContentTypeRecord contentType in contentTypes) { - var contentTypeEntry = new ContentTypeEntry() {Name = contentType.Name,DisplayName = contentType.Name}; + foreach(var contentType in contentTypes) { + var contentTypeEntry = new ContentTypeEntry {Name = contentType.Name,DisplayName = contentType.Name}; if (contentType.Name==id) { - foreach(ContentTypePartNameRecord contentTypePartNameRecord in contentTypePartNames) { - var contentTypePartEntry = new ContentTypePartEntry() { Name = contentTypePartNameRecord.PartName }; + foreach(var contentTypePartNameRecord in contentTypePartNames) { + var contentTypePartEntry = new ContentTypePartEntry { Name = contentTypePartNameRecord.PartName }; foreach(var contentTypePartEntryTest in contentType.ContentParts) { - if (contentTypePartEntryTest.PartName==contentTypePartEntry.Name) { + if (contentTypePartEntryTest.PartName.PartName==contentTypePartEntry.Name) { contentTypePartEntry.Selected = true; } } @@ -44,8 +49,7 @@ namespace Orchard.MetaData.Controllers model.SelectedContentType = contentTypeEntry; } model.ContentTypes.Add(contentTypeEntry); - }; - + } return View(model); } @@ -55,13 +59,14 @@ namespace Orchard.MetaData.Controllers [HttpPost] public ActionResult Save(string id, FormCollection collection) { - ContentTypeRecord contentTypeRecord = _contentTypeService.GetContentTypeRecord(id); + if (!Services.Authorizer.Authorize(Permissions.ManageMetaData, T("Not allowed to manage MetaData"))) + return new HttpUnauthorizedResult(); + + var contentTypeRecord = _contentTypeService.GetContentTypeRecord(id); + //using a while loop because we are removing items from the collection while (contentTypeRecord.ContentParts.Count>0) { - _contentTypeService.UnMapContentTypeToContentPart(contentTypeRecord.Name, contentTypeRecord.ContentParts[0].PartName); + _contentTypeService.UnMapContentTypeToContentPart(contentTypeRecord.Name, contentTypeRecord.ContentParts[0].PartName.PartName); } - //foreach(var contentTypePartNameRecord in contentTypeRecord.ContentParts) { - // _contentTypeService.UnMapContentTypeToContentPart(contentTypeRecord.Name,contentTypePartNameRecord.PartName); - //} foreach(var formKey in collection.AllKeys) { if (formKey.Contains("part_")) { var partName = formKey.Replace("part_", ""); @@ -69,7 +74,7 @@ namespace Orchard.MetaData.Controllers } } - return RedirectToAction("ContentTypeList", new { id = id }); + return RedirectToAction("ContentTypeList", new { id }); } diff --git a/src/Orchard.Web/Modules/Orchard.MetaData/Permissions.cs b/src/Orchard.Web/Modules/Orchard.MetaData/Permissions.cs index 521e33e2b..d0bbb35ed 100644 --- a/src/Orchard.Web/Modules/Orchard.MetaData/Permissions.cs +++ b/src/Orchard.Web/Modules/Orchard.MetaData/Permissions.cs @@ -1,20 +1,10 @@ using System.Collections.Generic; -using System.Linq; using Orchard.Security.Permissions; namespace Orchard.MetaData { public class Permissions : IPermissionProvider { public static readonly Permission ManageMetaData = new Permission { Description = "Manage MetaData", Name = "ManageMetaData" };//q: Should edit_MetaData be ManageMetaData? - public static readonly Permission PublishOthersMetaDataPost = new Permission { Description = "Publish or unpublish MetaData post for others", Name = "PublishOthersMetaDataPost", ImpliedBy = new[] { ManageMetaData } }; - public static readonly Permission PublishMetaDataPost = new Permission { Description = "Publish or unpublish MetaData post", Name = "PublishMetaDataPost", ImpliedBy = new[] { PublishOthersMetaDataPost } }; - public static readonly Permission EditOthersMetaDataPost = new Permission { Description = "Edit any MetaData posts", Name = "EditOthersMetaDataPost", ImpliedBy = new[] { PublishOthersMetaDataPost } }; - public static readonly Permission EditMetaDataPost = new Permission { Description = "Edit own MetaData posts", Name = "EditMetaDataPost", ImpliedBy = new[] { EditOthersMetaDataPost, PublishMetaDataPost } }; - public static readonly Permission DeleteOthersMetaDataPost = new Permission { Description = "Delete MetaData post for others", Name = "DeleteOthersMetaDataPost", ImpliedBy = new[] { ManageMetaData } }; - public static readonly Permission DeleteMetaDataPost = new Permission { Description = "Delete MetaData post", Name = "DeleteMetaDataPost", ImpliedBy = new[] { DeleteOthersMetaDataPost } }; - - public static readonly Permission MetaListOthersMetaData = new Permission { ImpliedBy = new[] { EditOthersMetaDataPost, PublishOthersMetaDataPost, DeleteOthersMetaDataPost } }; - public static readonly Permission MetaListMetaData = new Permission { ImpliedBy = new[] { EditMetaDataPost, PublishMetaDataPost, DeleteMetaDataPost } }; public string ModuleName { get { @@ -25,12 +15,6 @@ namespace Orchard.MetaData { public IEnumerable GetPermissions() { return new Permission[] { ManageMetaData, - EditMetaDataPost, - EditOthersMetaDataPost, - PublishMetaDataPost, - PublishOthersMetaDataPost, - DeleteMetaDataPost, - DeleteOthersMetaDataPost, }; } @@ -40,22 +24,6 @@ namespace Orchard.MetaData { Name = "Administrator", Permissions = new[] {ManageMetaData} }, - new PermissionStereotype { - Name = "Editor", - Permissions = new[] {PublishOthersMetaDataPost,EditOthersMetaDataPost,DeleteOthersMetaDataPost} - }, - new PermissionStereotype { - Name = "Moderator", - //Permissions = new[] {} - }, - new PermissionStereotype { - Name = "Author", - Permissions = new[] {PublishMetaDataPost,EditMetaDataPost,DeleteMetaDataPost} - }, - new PermissionStereotype { - Name = "Contributor", - Permissions = new[] {EditMetaDataPost} - }, }; } diff --git a/src/Orchard.Web/Modules/Orchard.MetaData/Properties/AssemblyInfo.cs b/src/Orchard.Web/Modules/Orchard.MetaData/Properties/AssemblyInfo.cs index a7fe0e116..9ce2239ad 100644 --- a/src/Orchard.Web/Modules/Orchard.MetaData/Properties/AssemblyInfo.cs +++ b/src/Orchard.Web/Modules/Orchard.MetaData/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/src/Orchard.Web/Modules/Orchard.MetaData/Views/MetaData/ContentTypeList.ascx b/src/Orchard.Web/Modules/Orchard.MetaData/Views/MetaData/ContentTypeList.ascx index 532150494..c0b78eead 100644 --- a/src/Orchard.Web/Modules/Orchard.MetaData/Views/MetaData/ContentTypeList.ascx +++ b/src/Orchard.Web/Modules/Orchard.MetaData/Views/MetaData/ContentTypeList.ascx @@ -15,13 +15,13 @@ <% foreach (var item in Model.ContentTypes) { %> <% - string contentTypeClass = ""; + var contentTypeClass = ""; if (Model.SelectedContentType!=null && Model.SelectedContentType.Name == item.Name) { - contentTypeClass = "SelectedContentPart"; - }else{ - contentTypeClass = "UnSelectedContentPart"; - } + contentTypeClass = "SelectedContentPart"; + }else{ + contentTypeClass = "UnSelectedContentPart"; + } %> diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index a27a4eb42..77007d0fa 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -3,9 +3,6 @@ using System.Linq; using System.Web; using Orchard.Comments.Models; using Orchard.ContentManagement; -using Orchard.ContentManagement.MetaData.Models; -using Orchard.ContentManagement.MetaData.Records; -using Orchard.ContentManagement.Records; using Orchard.Core.Common.Models; using Orchard.Core.Navigation.Models; using Orchard.Core.Settings.Models; diff --git a/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs index 70ece4268..91b12f342 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs @@ -56,7 +56,7 @@ namespace Orchard.ContentManagement.Drivers { { var contentPartInfo = new List() { new ContentPartInfo() - {partName = typeof(TContent).Name,Factory = () => new TContent()} + {PartName = typeof(TContent).Name,Factory = () => new TContent()} }; return contentPartInfo; diff --git a/src/Orchard/ContentManagement/MetaData/ContentPartHandler.cs b/src/Orchard/ContentManagement/MetaData/ContentPartHandler.cs index 9ecb104f5..598ce88bd 100644 --- a/src/Orchard/ContentManagement/MetaData/ContentPartHandler.cs +++ b/src/Orchard/ContentManagement/MetaData/ContentPartHandler.cs @@ -25,10 +25,12 @@ namespace Orchard.ContentManagement.MetaData protected override void Activating(ActivatingContentContext context) { var contentTypeRecord = _contentTypeService.GetContentTypeRecord(context.ContentType) ?? new ContentTypeRecord(); + if (contentTypeRecord.ContentParts != null){ foreach (var contentTypePartRecord in contentTypeRecord.ContentParts){ - var record = contentTypePartRecord; - var contentPart = _contentPartInfos.Single(x => x.partName == record.PartName).Factory(); + //var record = contentTypePartRecord; + + var contentPart = _contentPartInfos.Single(x => x.PartName == contentTypePartRecord.PartName.PartName).Factory(); context.Builder.Weld(contentPart); } } diff --git a/src/Orchard/ContentManagement/MetaData/ContentPartInfo.cs b/src/Orchard/ContentManagement/MetaData/ContentPartInfo.cs index 8122efbd7..23a731cbf 100644 --- a/src/Orchard/ContentManagement/MetaData/ContentPartInfo.cs +++ b/src/Orchard/ContentManagement/MetaData/ContentPartInfo.cs @@ -4,7 +4,7 @@ namespace Orchard.ContentManagement.MetaData { public class ContentPartInfo { - public string partName; - public Func Factory; + public string PartName { get; set; } + public Func Factory { get; set; } } } diff --git a/src/Orchard/ContentManagement/MetaData/Models/ContentTypePart.cs b/src/Orchard/ContentManagement/MetaData/Models/ContentTypePart.cs deleted file mode 100644 index f4def626f..000000000 --- a/src/Orchard/ContentManagement/MetaData/Models/ContentTypePart.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Web.Mvc; -using Orchard.ContentManagement; -using Orchard.ContentManagement.MetaData.Records; - -namespace Orchard.ContentManagement.MetaData.Models -{ - public class ContentTypePart : ContentPart - { - - } -} diff --git a/src/Orchard/ContentManagement/MetaData/Records/ContentTypePartRecord.cs b/src/Orchard/ContentManagement/MetaData/Records/ContentTypePartRecord.cs index 93de671dc..e723d18e7 100644 --- a/src/Orchard/ContentManagement/MetaData/Records/ContentTypePartRecord.cs +++ b/src/Orchard/ContentManagement/MetaData/Records/ContentTypePartRecord.cs @@ -1,6 +1,6 @@ namespace Orchard.ContentManagement.MetaData.Records { public class ContentTypePartRecord { public virtual int Id { get; set; } - public virtual string PartName { get; set; } + public virtual ContentTypePartNameRecord PartName { get; set; } } } diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentTypeService.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentTypeService.cs index b51574664..a4f1d022b 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/ContentTypeService.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/ContentTypeService.cs @@ -11,22 +11,34 @@ namespace Orchard.ContentManagement.MetaData.Services [UsedImplicitly] public class ContentTypeService : IContentTypeService { - private readonly IRepository _contentTypeRecord; - private readonly IRepository _contentTypePartNameRecord; - private readonly IRepository _contentTypePartRecord; + private readonly IRepository _contentTypeRepository; + private readonly IRepository _contentTypePartNameRepository; + private readonly IRepository _contentTypePartRepository; - public ContentTypeService(IRepository contentTypePartRecord, IRepository contentTypeRecord, IRepository contentTypePartNameRecord) + public ContentTypeService(IRepository contentTypePartRepository, IRepository contentTypeRepository, IRepository contentTypePartNameRepository) { - _contentTypeRecord = contentTypeRecord; - _contentTypePartNameRecord = contentTypePartNameRecord; - _contentTypePartRecord = contentTypePartRecord; + _contentTypeRepository = contentTypeRepository; + _contentTypePartNameRepository = contentTypePartNameRepository; + _contentTypePartRepository = contentTypePartRepository; + } + + public ContentTypePartNameRecord GetContentPartNameRecord(string name) { + return _contentTypePartNameRepository.Fetch(x => x.PartName == name).Single(); } public void MapContentTypeToContentPart(string contentType, string contentPart) { var contentTypeRecord = GetContentTypeRecord(contentType) ?? new ContentTypeRecord(); contentTypeRecord.Name = contentType; + var contentTypePartNameRecord = + _contentTypePartNameRepository.Fetch(x => x.PartName == contentPart).SingleOrDefault(); + if (contentTypePartNameRecord==null) { + contentTypePartNameRecord=new ContentTypePartNameRecord(){PartName = contentPart}; + _contentTypePartNameRepository.Update(contentTypePartNameRecord); + contentTypePartNameRecord = + _contentTypePartNameRepository.Fetch(x => x.PartName == contentPart).SingleOrDefault(); + } var contentTypePartRecord = new ContentTypePartRecord() { - PartName = contentPart + PartName = contentTypePartNameRecord }; if (contentTypeRecord.ContentParts==null) { contentTypeRecord.ContentParts = new List { contentTypePartRecord }; @@ -35,15 +47,17 @@ namespace Orchard.ContentManagement.MetaData.Services contentTypeRecord.ContentParts.Add(contentTypePartRecord); } - _contentTypeRecord.Update(contentTypeRecord); + _contentTypeRepository.Update(contentTypeRecord); } public void UnMapContentTypeToContentPart(string contentType, string contentPart) { var contentTypeRecord = GetContentTypeRecord(contentType) ?? new ContentTypeRecord(); - var contentTypePartRecord = contentTypeRecord.ContentParts.Single(x => x.PartName == contentPart); + var contentTypePartNameRecord = _contentTypePartNameRepository.Fetch(x => x.PartName == contentPart).Single(); + + var contentTypePartRecord = contentTypeRecord.ContentParts.SingleOrDefault(x => x.PartName == contentTypePartNameRecord); if (contentTypePartRecord != null) { - _contentTypePartRecord.Delete(contentTypePartRecord); + _contentTypePartRepository.Delete(contentTypePartRecord); contentTypeRecord.ContentParts.Remove(contentTypePartRecord); } } @@ -52,7 +66,7 @@ namespace Orchard.ContentManagement.MetaData.Services var contentTypeRecord = GetContentTypeRecord(contentType) ?? new ContentTypeRecord(); if (contentTypeRecord.ContentParts.Count==0) return false; - var contentTypePart = contentTypeRecord.ContentParts.Single(x => x.PartName == contentPart); + var contentTypePart = contentTypeRecord.ContentParts.Single(x => x.PartName.PartName == contentPart); return contentTypePart != null; } @@ -62,27 +76,19 @@ namespace Orchard.ContentManagement.MetaData.Services PartName = contentTypePartName }; - _contentTypePartNameRecord.Update(contentTypePartNameRecord); + _contentTypePartNameRepository.Update(contentTypePartNameRecord); } public ContentTypeRecord GetContentTypeRecord(string contentTypeName) { - var contentTypeCount = _contentTypeRecord.Table.Count(x => x.Name == contentTypeName); - if (contentTypeCount > 0) { - var contentTypeRecord = _contentTypeRecord.Table.Single(x => x.Name == contentTypeName); - return contentTypeRecord; - } - else { - return null; - } - + return _contentTypeRepository.Fetch(x => x.Name == contentTypeName).SingleOrDefault(); } public IEnumerable GetContentTypes() { - return _contentTypeRecord.Table.ToList(); + return _contentTypeRepository.Table.ToList(); } public IEnumerable GetContentTypePartNames() { - return _contentTypePartNameRecord.Table.ToList(); + return _contentTypePartNameRepository.Table.ToList(); } } diff --git a/src/Orchard/ContentManagement/MetaData/Services/IContentTypeService.cs b/src/Orchard/ContentManagement/MetaData/Services/IContentTypeService.cs index 6b71fd20d..2ab533896 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/IContentTypeService.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/IContentTypeService.cs @@ -12,5 +12,6 @@ namespace Orchard.ContentManagement.MetaData.Services bool ValidateContentTypeToContentPartMapping(string contentType, string contentPart); IEnumerable GetContentTypes(); IEnumerable GetContentTypePartNames(); + ContentTypePartNameRecord GetContentPartNameRecord(string name); } } diff --git a/src/Orchard/ContentManagement/Records/ContentPartRecord.cs b/src/Orchard/ContentManagement/Records/ContentPartRecord.cs index b51db5f85..df2c6f019 100644 --- a/src/Orchard/ContentManagement/Records/ContentPartRecord.cs +++ b/src/Orchard/ContentManagement/Records/ContentPartRecord.cs @@ -1,6 +1,9 @@ +using Orchard.Data.Conventions; + namespace Orchard.ContentManagement.Records { public abstract class ContentPartRecord { public virtual int Id { get; set; } + [CascadeAllDeleteOrphan] public virtual ContentItemRecord ContentItemRecord { get; set; } } } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 1b3d63aa9..17d230cb7 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -185,7 +185,6 @@ - @@ -465,6 +464,9 @@ + + +