使用ServiceStack ORMLite保存引用

时间:2015-01-20 21:31:16

标签: orm servicestack ormlite-servicestack

我使用ORMLite作为我的ORM,我使用的是以下包含外键关系的结构:

 public class Order
    {
        [AutoIncrement]
        public int Id { get; set; }

        [Reference]
        public Item Item { get; set; }

        public string ProUserId { get; set; }

        public string Details { get; set; }
    }

    public class Item
    {
        [AutoIncrement]
        public int Id { get; set; }
        public string Description { get; set; }
    }

我们可以看到Order包含对Item的引用。在DB Order表中有一个名为ItemId的外键,我在设计视图中使用[Reference]属性注释了该键。

我正在尝试使用以下代码保存订单:

var order = new Order
                {
                    Item = new Item
                    {
                        Id  = 3,
                        Description = "Something"
                    },

                    ProUserId = "kunal@kunal.com",
                    Details = "fdfsdfsd"

                };

                Db.Save(order,references:true);

我希望ORMLite会在Order表中获取关系和ItemID,但它没有,而是确实抛出了以下错误:

Cannot insert the value NULL into column 'ItemId', table 'WebApp.dbo.Order'; column does not allow nulls. INSERT fails.

我尝试更改我的架构并在我的Item表中添加OrderId列并引用它,并且工作正常。但这不是正确的设计。我应该在代码/架构中进行任何更改以支持此功能吗?

1 个答案:

答案 0 :(得分:2)

您仍需要提供OrmLite可用于存储关系的外键,例如在Child / ForeignKey表上:

public class Order
{
    [AutoIncrement]
    public int Id { get; set; }

    [Reference]
    public Item Item { get; set; }

    public string ProUserId { get; set; }

    public string Details { get; set; }
}

public class Item
{
    [AutoIncrement]
    public int Id { get; set; }
    public int OrderId { get; set; }  //Parent Table PK
    public string Description { get; set; }
}

1:1 关系,可以在父表上,例如:

public class Order
{
    [AutoIncrement]
    public int Id { get; set; }

    [Reference]
    public Item Item { get; set; }

    public int ItemId { get; set; }  //Child Table PK

    public string ProUserId { get; set; }

    public string Details { get; set; }
}

public class Item
{
    [AutoIncrement]
    public int Id { get; set; }
    public string Description { get; set; }
}