Sitecore Glass数据模型继承

时间:2014-07-23 10:59:19

标签: sitecore sitecore7 glass-mapper

我在Sitecore实例上使用Glass Mapper,我的基本数据模板结构为

  • 基地
    • BaseWithList
    • BaseWithExtraContent
      • BaseWithExtraContentAndCallToActionLink

我在项目中添加了模型类以遵循此结构。我的班级名称与我的模板名称相匹配。

[SitecoreType(TemplateId = "{5D19BD92-799E-4DC1-9A4E-1DDE3AD68DAD}", AutoMap = true)]
public class Base
{
   public virtual string Title {get;set;}
   public virtual string Content {get;set;}
}

[SitecoreType(TemplateId = "{0491E3D6-EBAA-4E21-B255-80F0607B176D}", AutoMap = true)]
public class BaseWithExtraContent : Base
{
    public virtual string ExtraContent {get;set;}
}

[SitecoreType(TemplateId = "{95563412-7A08-46A3-98CB-ABC4796D57D4}", AutoMap = true)]
public class BaseWithExtraContentAndCallToActionLink : BaseWithExtraContent
{
    public virtual string CallToActionLink {get;set;}
}

这些数据模型是从另一个具有基类型列表的类中使用的,我希望能够在此处存储任何派生类型,因此我添加了详细信息tutorial

[SitecoreType(AutoMap = true)]
public class HomePage
{
    [SitecoreChildren(InferType = true)]
    [SitecoreField(FieldName = "Widgets")]
    public virtual IEnumerable<Base> Widgets { get; set; }
}

根据tutorial这应该有效。但是,小部件列表只包含基类型的类。

然后我找到了一个后来的tutorial,它说如果你将模型分离到不同于安装了Glass的模块,你必须添加一个指向模型所在组件的AttributeConfigurationLoader。基础和派生类型都在同一个程序集中,所以我不确定这会解决问题,但无论如何我都试过了。

我的自定义加载程序配置如下所示:

public static  class GlassMapperScCustom
{
    public static void CastleConfig(IWindsorContainer container)
    {
        var config = new Config {UseWindsorContructor = true};

        container.Install(new SitecoreInstaller(config));
    }

    public static IConfigurationLoader[] GlassLoaders()
    {

        var attributes = new AttributeConfigurationLoader("Project.Data");

        return new IConfigurationLoader[] {attributes};
    }
    public static void PostLoad(){
        //Remove the comments to activate CodeFist
        /* CODE FIRST START
        var dbs = Sitecore.Configuration.Factory.GetDatabases();
        foreach (var db in dbs)
        {
            var provider = db.GetDataProviders().FirstOrDefault(x => x is GlassDataProvider) as GlassDataProvider;
            if (provider != null)
            {
                using (new SecurityDisabler())
                {
                    provider.Initialise(db);
                }
            }
        }
         * CODE FIRST END
         */
    }
}

在执行自定义加载程序配置后,我现在得到一个&#34;模糊匹配找到&#34;例外。我已经检查过是否在该程序集的类中设置了任何其他非Glass属性,并且没有。

有什么想法吗?我想有两个问题。

  1. 为什么使用推断类型属性不加载正确的类型而只加载基类型?
  2. 为什么当我尝试通过添加自定义属性加载器来解决此问题时,我会得到异常吗?

1 个答案:

答案 0 :(得分:1)

小部件属性有两个属性 - 它既可以映射到项目的子元素,也可以映射到字段,不能同时存在。