Orchard CMS 1.x [文件存储] - 混合记录支持&记录较少的属性

时间:2014-01-18 11:22:02

标签: asp.net orchardcms asp.net-mvc-5

我正在关注Bertrand Le Roy将OrchardCMS迁移到文档存储(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中的电子邮件列。但随后它将数据写入2个位置。在xml中,它只会插入手机和电子邮件字段。在表格中,它将插入整个记录。

我知道如果我使用Retrieve()代替this.Retrieve(),那么它会将整个记录存储在两个地方等等......

但我感兴趣的是只在XML信息集中只有一些字段,而在记录表中只有一些字段。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

如果您的部件有记录,您仍然可以仅在信息集中定位属性,而不需要存在记录属性。为此,请使用this.As<InfosetPart>()获取信息集。然后,使用InfosetHelper中的扩展方法,例如infosetPart.Retrieve<string>("Phone")infosetPart.Store<string>("Phone", value)