2014-01-18 62 views
4

我下面貝特朗·勒羅伊的指導OrchardCMS遷移到文件存儲(1.x的預分支版本)果園CMS 1.x的[文件存儲] - 混合記錄有力地與紀錄的水平低性能

http://weblogs.asp.net/bleroy/archive/2013/11/04/the-shift-how-orchard-painlessly-shifted-to-document-storage-and-how-it-ll-affect-you.aspx

以下是我的示例代碼中的一些摘錄,試圖在ContentPart中混合記錄備份和無記錄屬性。

遷移

public int Create() { 
     SchemaBuilder.CreateTable("CustomerPartRecord", 
      table => table 
       .ContentPartRecord() 
       .Column<string>("Name") 
      ); 

     ContentDefinitionManager.AlterPartDefinition("CustomerPart", builder => builder 
      .Attachable()); 

     ContentDefinitionManager.AlterTypeDefinition("Customer", 
      type => type 
       .WithPart("CommonPart") 
       .WithPart("Title") 
       .WithPart("CustomerPart") 
       .Creatable()); 
     return 1; 
    } 

ContentPartRecord

public class CustomerPartRecord : ContentPartRecord { 
    public virtual string Name { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Email { get; set; } 
} 

ContentPart

public class CustomerPart : ContentPart<CustomerPartRecord> 
{ 
    public string Name 
    { 
     get { return Record.Name; } // tried "return Retrieve(x=>x.Name);" 
     set { Record.Name = value; } // tried "return Store(x=>x.Name, value);" 
    } 
    public string Phone 
    { 
     get { return this.Retrieve(x => x.Phone); } //Recordless property 
     set { this.Store(x => x.Phone, value); } 
    } 
    public string Email 
    { 
     get { return this.Retrieve(x => x.Email); } //Recordless property 
     set { this.Store(x => x.Email, value); } 
    } 
} 

拋出的弗洛嘗試添加一個新的記錄

could not insert: [Customers.Models.CustomerPartRecord#28][SQL: INSERT INTO Teknorix_Customers_CustomerPartRecord (Name, Phone, Email, Id) VALUES (?, ?, ?, ?)] ---> System.Data.SqlServerCe.SqlCeException: The column name is not valid. [ Node name (if any) = ,Column name = Phone ] 

,如果我在DB添加手機& email列這工作完全正常,當翼錯誤。但是然後它將數據寫入2個地方。在xml中它只會插入電話和電子郵件字段。並在表格中插入整個記錄。

我知道如果我使用到位this.Retrieve(的檢索()),那麼它就會存儲在這兩個地方,等等等等整個記錄...

但是我感興趣的只有只是一些領域在XML信息集中以及僅在記錄表中的一些字段中。我在這裏做錯了什麼?

回答

3

如果您的零件有記錄,則仍可以僅在信息集中定位屬性,而不要求存在記錄屬性。爲此,請使用this.As<InfosetPart>()獲取信息集。然後,使用InfosetHelper的擴展方法,例如infosetPart.Retrieve<string>("Phone")infosetPart.Store<string>("Phone", value)

+0

沒有捷徑方法來做到這一點? – Yashvit

+0

不需要。如果您需要,可以創建一個,它只是擴展方法。 –

+0

不是這樣的this.Retrieve()。我知道如何訪問記錄較少的屬性。我如何訪問僅在記錄中的屬性? – Yashvit