2016-03-29 4 views
0

я получаю за исключением:Entity Framework «Нарушение первичного ключа» с составным первичным ключом

Нарушения ограничения первичного ключа «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; } 
} 

FYI, этот класс отмечен sealed только потому, что ReSharper спрашивал его, и ошибка была уже происходит, прежде чем я это сделал.

+0

Нет такой вещи, как два первичных ключа для одной и той же таблицы. У вас может быть составной ключ, и как любой первичный ключ он должен быть уникальным. –

+0

@AndrewSavinykh Это сложный ключ, я просто оговорюсь. –

+1

Поэтому он должен быть уникальным. И в вашем случае это не так. –

ответ

1

Я только что опубликовал комментарий, который заставлял меня задуматься о чем-то, и это устранило мою проблему. Проблема для меня заключалась в том, что когда у вас есть составной ключ, автоинкремент больше не работает (теперь мне это кажется очень очевидным), поэтому все, что я сделал, было установлено ParcelaId со значением i в цикле заполняется ListaParcelas , Теперь я буду отмечать это как ответ, но если кто-нибудь покажет мне, как это сделать с автоматическим приращением, я помечаю их как ответ.

Смежные вопросы