如何修复Glass Mapper错误 - 无法找到父项类型的配置?

时间:2016-11-18 14:55:27

标签: configuration sitecore sitecore8 glass-mapper sitecore8.1

我有一个Sitecore 8.1 CD实例。我还有一些代码需要在Master数据库中创建一个内容项。 (我知道这是禁止的,但我只需要在此刻解决这个问题)当我的代码尝试使用Glass Mapper创建内容项时,我收到错误。这是代码片段和错误消息。我只是想了解错误的含义。我有一种感觉,这只是一个配置问题。此代码在我们的Sitecore CM服务器上正常工作。所以我希望通过简单地调整我们的CD服务器上的配置,我可以让它工作。到目前为止,我已经在ConnectionStrings.config和Sitecore.config中重新启用了Master条目。但这并没有解决这个问题。

SitecoreService service = new SitecoreService("master");
SimpleAes aes = new SimpleAes();

using (new SecurityDisabler())
{
    Item parentItem =  Factory.GetDatabase("master").GetItem("/sitecore/content/Non Page Content/Account Information/Shipping Addresses");
    newAddress = service.Create(parentItem, newAddress);     //THIS IS WHERE THE CODE FAILS
    user.Addresses.Add(newAddress);
    Utility.PublishItem(service.ResolveItem(newAddress));
    id = aes.EncryptToString(newAddress.Id.ToString());
    user.Addresses = user.Addresses;
    user.Save();
}

错误讯息:

  

Glass.Mapper.MapperException:无法找到父级的配置   item type Sitecore.Data.Items.Item ---> System.NullReferenceException:   你调用的对象是空的。在   System.Object.GetType()at   Glass.Mapper.Context.GetTypeConfiguration [T](Object obj,Boolean   doNotLoad,Boolean checkBase)at   Glass.Mapper.Sc.SitecoreService.Create [T,TK](TK parent,T newItem,   Boolean updateStatistics,Boolean silent)---内部异常结束   堆栈跟踪---在Glass.Mapper.Sc.SitecoreService.Create [T,TK](TK   parent,T newItem,Boolean updateStatistics,Boolean silent)

2 个答案:

答案 0 :(得分:0)

这条线失败了

Item parentItem =  Factory.GetDatabase("master").GetItem("/sitecore/content/Non Page Content/Account Information/Shipping Addresses");

如果你检查一下

if (parentItem != null) { // your code }

然后代码将完成,您将不会获得异常,但如果parentItem为null,则不会发生任何事情。

快速修复解决方案是给一个'主人' CD服务器上的数据库连接字符串(如你所说,这是禁止的)。更好的解决方案是通过Sitecore Item API或您的自定义API公开master数据库,通过身份验证保护它,然后通过API从CD服务器调用此代码。

答案 1 :(得分:0)

我不确定你是否还在寻找如何解决这个问题,但是当我今天遇到它时,我发现了你的问题。

问题是您的parentItem类型为Item。它导致Glass内部出现问题。 您可以将任何类型用作父类,但限制是它不应从Sitecore Item类继承。 试试这个:

var parentItem =  Factory.GetDatabase("master").GetItem("/sitecore/content/Non Page Content/Account Information/Shipping Addresses").GlassCast<BaseSitecoreItem>();
newAddress = service.Create(parentItem, newAddress); 

其中BaseSitecoreItem是您的玻璃模型。

它帮助了我,希望能帮到你。