我正在关注Bertrand Le Roy将OrchardCMS迁移到文档存储(1.x分支预发布)的指南
以下是我的示例代码中的一些摘录,试图在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信息集中只有一些字段,而在记录表中只有一些字段。我在这里做错了什么?
答案 0 :(得分:3)
如果您的部件有记录,您仍然可以仅在信息集中定位属性,而不需要存在记录属性。为此,请使用this.As<InfosetPart>()
获取信息集。然后,使用InfosetHelper
中的扩展方法,例如infosetPart.Retrieve<string>("Phone")
和infosetPart.Store<string>("Phone", value)
。