2014-07-23 17 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屬性有兩個屬性 - 它或者映射到項目的子元素,或者是一個字段,不能同時包含兩個屬性。