尝试从null一对一属性中分配id:ContentItemRecord - Orchard CMS

时间:2012-10-07 01:03:32

标签: c# asp.net orchardcms

我正在为Orchard CMS编写模块。

有几张桌子。在Migrations.cs中:

工作正常:

            SchemaBuilder.CreateTable("CustomerPartRecord", table => table
            .ContentPartRecord()
            .Column<string>("FirstName", c => c.WithLength(50))
            .Column<string>("LastName", c => c.WithLength(50))
            .Column<string>("Title", c => c.WithLength(10))
            .Column<DateTime>("CreatedUtc")
            );

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

        ContentDefinitionManager.AlterTypeDefinition("Customer", type => type
            .WithPart("CustomerPart")
            .WithPart("UserPart")
            );
        return 6;

但它不起作用:

            SchemaBuilder.CreateTable("OrderPartRecord", t => t
            .ContentPartRecord()
            .Column<int>("CustomerId", c => c.NotNull())
            .Column<DateTime>("CreatedAt", c => c.NotNull())
            .Column<decimal>("SubTotal", c => c.NotNull())
            .Column<string>("Status", c => c.WithLength(50).NotNull())
            );

        ContentDefinitionManager.AlterPartDefinition("OrderPart", part => part
             .Attachable(false)
        );

        ContentDefinitionManager.AlterTypeDefinition("Order", type => type
            .WithPart("OrderPart")
        );

尝试添加订单时出错。错误:尝试从null一对一属性中分配id:ContentItemRecord 出了什么问题?

UPD:

处理程序:

public class OrderPartHandler : ContentHandler
{
    public OrderPartHandler(IRepository<OrderPartRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}

创建订单:

_orderRepository.Create(order);

3 个答案:

答案 0 :(得分:6)

您不应该自己为部件记录创建记录。如果要在没有内容项的情况下创建它,请将其设为常规记录,而不是内容部分记录。内容部分记录需要始终与内容项相关联,并通过内容管理器而不是直接存储库创建。

答案 1 :(得分:2)

正如我猜测的那样,您正在尝试使用存储库创建订单,如果您没有采取足够的谨慎措施,则会导致错误。要解决此问题,请使用ContentManager创建订单,因为订单实际上是一个内容项。

PS:/此错误与nHibernate有关,特别是关于entites之间的关联。请阅读此链接以获取更多信息:Hibernate : attempted to assign id from null one-to-one property: employee

答案 2 :(得分:0)

实际上,您可以通过将缺失的参数分配给只需要填写订单的零件记录来解决此问题。ContentPartRecord= your_content_item.Record;