2014-07-23 69 views
1

我现在用的是玻璃映射在Sitecore的实例,其中我有Sitecore的玻璃数据模型的传承

  • 基地
    • 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 
     */ 
    } 
} 

在做自定义的加载配置我现在得到一个“不明确的匹配找到”异常。我检查过是否在该组件中的类中设置了其他非Glass属性,并且没有。

任何想法?我想这有两个问题。

  1. 为什么使用推断的类型属性不加载正确的类型和只有基类型?
  2. 为什么当我试图通过添加自定义属性加载器来解决这个问题时,我是否会得到异常?
+0

你有堆栈跟踪吗? –

+0

这里是玻璃自定义配置类代码: var attributes = new AttributeConfigurationLoader(“x.Data”); 返回新的IConfigurationLoader [] {attributes}; – chrishey

+0

堆栈跟踪太长而无法完整发布: [AmbiguousMatchException:找到模糊匹配。] System.RuntimeType.GetPropertyImpl(String name,BindingFlags bindingAttr,Binder联编程序,Type returnType,Type []类型,ParameterModifier []修饰符)+13922767 System.Type.GetProperty(String name)+65 Glass.Mapper.Utilities。GetProperty(Type type,String name)+330 Glass.Mapper.Utilities.GetAllProperties(Type type)+710 Glass.Mapper.Configuration.Attributes。 d__2.MoveNext()+169 – chrishey

回答

1

Widgets属性有两个属性 - 它或者映射到项目的子元素,或者是一个字段,不能同时包含两个属性。