添加包含复合主键的实体

时间:2016-04-15 17:25:46

标签: c# sql-server-2008-r2 entity-framework-5

我正在使用Entity Framework(我认为是V5),目前正在尝试向表中添加新行。我希望添加的表具有基于值“PRN”(基本上是唯一的客户ID)和相关序列号的复合主键。每次更新此表中的信息时,我们都会为PRN插入一个新行并递增序列号。序列号未定义为数据库上的自动递增值或IDENTITY,因为它不是唯一的 - 序列号仅对每个PRN唯一。

当我执行以下代码时,我得到一个InvalidOperationException:“属性'DDIPhasedPayment_Seq_Num'是对象的密钥信息的一部分,无法修改。”

如果我只修改主键的PRN部分并保存记录(导致Seq_Num的默认值为零),那么EF似乎并不介意,但是当我尝试修改其他部分时抛出异常PK。如何在不扰乱EF的情况下为此表创建和添加行?

var nextSequence = GetNextPhasedPaymentSequenceNumber(message.Prn);
var entity = new Practitioner_DDI_PhasedPayment()
{
    PRN = message.Prn,
    DDIPhasedPayment_Seq_Num = nextSequence,
    TSN = message.Tsn,
    //........
    //Various other fields populated
    //........
};
dbContext.Practitioner_DDI_PhasedPayment.Add(entity);

dbContext.SaveChanges();

1 个答案:

答案 0 :(得分:0)

格特 - 感谢您的提示,这正是问题所在:

private short GetNextPhasedPaymentSequenceNumber(int prn)
    {
        var lastPayment = WISERDb.Practitioner_DDI_PhasedPayment.Where(ddipp => ddipp.PRN == prn).OrderByDescending(k => k.DDIPhasedPayment_Seq_Num).FirstOrDefault();

        if (lastPayment == null) { return 1; }

        else { return ++lastPayment.DDIPhasedPayment_Seq_Num; }
    }

这里使用++运算符是问题 - 它应该返回值+ 1。

相关问题