я получаю за исключением: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 спрашивал его, и ошибка была уже происходит, прежде чем я это сделал.
Нет такой вещи, как два первичных ключа для одной и той же таблицы. У вас может быть составной ключ, и как любой первичный ключ он должен быть уникальным. –
@AndrewSavinykh Это сложный ключ, я просто оговорюсь. –
Поэтому он должен быть уникальным. И в вашем случае это не так. –