SQLiteNetExtensions-当子表上存在外键约束时,InsertWithChildrenAsync不起作用

时间:2019-03-04 00:50:01

标签: xamarin.forms

Xamarin.Forms项目,使用SQLiteNetExtensions 2.0.0和sqlite-net-pcl 1.5.231

我正在尝试将新记录插入sqlite数据库。当我在子表上删除NOT NULL和Foreign Key约束时,我的方案有效。当我重新添加约束时,出现以下异常:

SQLite.SQLiteException:'约束'

  • 父模型
[Table("RetailItem")]

public class RetailItemDTO

{

    [PrimaryKey, AutoIncrement]
    public int RetailItemId { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public bool Taxable { get; set; }

    public int DepartmentId { get; set; }

    public int RetailTypeId { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<RetailItemRetailerPriceDTO> Prices { get; set; }
}
  • 子模型
[Table("RetailItemRetailerPrice")]

public class RetailItemRetailerPriceDTO

{

    [PrimaryKey, AutoIncrement]
    public int RetailItemRetailerPriceId { get; set; }

    [ForeignKey(typeof(RetailItemDTO)), NotNull]
    public int RetailItemId { get; set; }

    public int RetailerId { get; set; }

    public decimal Price { get; set; }
}
  • 插入/更新逻辑
public async Task Save(RetailItem entity)

{

    var dto = GetDTOFromBusinessModel(entity);

    if (dto.RetailItemId == 0)
    {
        await _sqliteRepository.Database.InsertWithChildrenAsync(dto, true);

        entity.Id = dto.RetailItemId;
    }
    else
        await _sqliteRepository.Database.InsertOrReplaceWithChildrenAsync(dto, true);
}

如果我已有一个具有新价格的RetailItem,则InsertOrReplaceWithChildrenAsync调用没有问题将失败,并显示以下内容:SQLite.NotNullConstraintViolationException:'没有NULL约束失败:RetailItemRetailerPrice.RetailItemId'

每当我添加一个带有新RetailItemRetailerPrice的新RetailItem时,就会发生约束异常。

如果我在RetailItemRetailerPrice表上删除了RetailItemId的NOT NULL和外键约束,那么这两个调用都会起作用。

我想在桌子上保留适当的约束。

我缺少一些可以使我的方案正常工作的属性吗?

1 个答案:

答案 0 :(得分:0)

您已将RetailItemId设置为非空,在RetailItemRetailerPrice表中添加新商品时,必须为新价格设置RetailItemId

[ForeignKey(typeof(RetailItemDTO)), NotNull] public int RetailItemId { get; set; }

如果您不想在表上保留约束。在RetailItemRetailerPrice表中添加新项之前,可以查询RetailItem表,获取RetailItemId,最后,可以在RetailItemRetailerPrice表中添加此新项