【问题标题】:Add entity which contains composite Primary Key添加包含复合主键的实体
【发布时间】:2016-04-17 03:57:46
【问题描述】:

我正在使用实体框架(我认为是 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();

【问题讨论】:

  • 您确定没有更改GetNextPhasedPaymentSequenceNumber 中的PK 值吗?

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


【解决方案1】:

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

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多