实体框架"违反主要密钥"使用复合主键

时间:2016-03-29 21:51:28

标签: c# entity-framework

我得到了例外:

  

违反PRIMARY KEY约束' PK_dbo.Parcelas'。无法在对象' dbo.Parcelas'中插入重复的密钥。重复键值为(0,15)。   声明已经终止。

即使我没有向表格Parcelas添加内容,我也会收到此错误。请参阅以下代码:

using (var trans = _db.Database.BeginTransaction())
{
    try
    {
        var f = cbxFornecedor.SelectedItem as Fornecedor;
        var c = new Compra
        {
            //load properties
        };
        _db.Compras.Add(c);
        foreach (var cada in _itens)
        {
            c.ListaProdutos.Add(new ListaProdutos
            {
                //load properties
            });
            _db.Produtos.Find(cada.ProdutoClasse.ProdutoId).Estoque += cada.Quantidade;

        }
        var conta = new Conta
        {
            //load properties
            ListaParcelas = new List<Parcela>() 
           //this is the property the decides if the code is going to run or not.
           //With it, i get the error, without it, it runs fine
        };
        if(rbtPrazo.Checked)
            for (var i = 0; i < nudParcelas.Value; i++)
                conta.ListaParcelas.Add(new Parcela
                {
                    //load properties
                });
        c.Conta = conta;
        _db.SaveChanges();
        trans.Commit();
        Close();
    }
    catch (Exception ex)
    {
        trans.Rollback();
        MessageBox.Show(this, ex.Message, @"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

如果我实例化列表ListaParcelas,那么交易破坏者就是。 模型Parcela有一个复合主键,我认为这是我问题的根源,尽管我只猜测这个问题。这是模特:

public sealed class Parcela
{
    [Key, Column(Order = 1)]
    public int ParcelaId { get; set; }

    [Key, Column(Order = 2)]
    public int ContaId { get; set; }

    [Required]
    public decimal Valor { get; set; }

    [ForeignKey("ContaId")]
    public Conta Conta { get; set; }

    [Required]
    public DateTime Vencimento { get; set; }
}

仅供参考,这个类被标记为sealed,因为ReSharper正在询问它并且错误已经发生在我之前。

1 个答案:

答案 0 :(得分:1)

我刚刚发表了一条评论,让我思考了一些事情并解决了我的问题。对我来说问题是,当你有一个复合键时,自动增量不再起作用(现在对我来说似乎很明显),所以我所做的只是设置ParcelaId的值为{{1在循环中填充i。 现在,我将此标记为答案,但如果有人告诉我如何使用自动增量,我会将它们标记为答案。