我得到了例外:
违反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正在询问它并且错误已经发生在我之前。
答案 0 :(得分:1)
我刚刚发表了一条评论,让我思考了一些事情并解决了我的问题。对我来说问题是,当你有一个复合键时,自动增量不再起作用(现在对我来说似乎很明显),所以我所做的只是设置ParcelaId
的值为{{1在循环中填充i
。
现在,我将此标记为答案,但如果有人告诉我如何使用自动增量,我会将它们标记为答案。