添加包含复合主键的实体
Add entity which contains composite Primary Key
我正在使用 Entity Framework(我认为是 V5)并且目前正在尝试向 table 添加一个新行。我希望添加的 table 有一个基于值 "PRN" 的复合主键(基本上是一个唯一的客户 ID)和一个关联的序列号。每次更新此 table 中的信息时,我们都会为 PRN 插入一个新行并增加序列号。序列号未定义为数据库中的自动递增值或 IDENTITY,因为它不是唯一的 - 序列号仅在每个 PRN 中是唯一的。
当我执行以下代码时,我得到一个 InvalidOperationException:"The property 'DDIPhasedPayment_Seq_Num' is part of the object's key information and cannot be modified."
EF 似乎不介意我只修改主键的 PRN 部分并保存记录(这导致 Seq_Num 的默认值为零)但是当我尝试修改PK的另一部分。如何在不扰乱 EF 的情况下为此 table 创建并添加一行?
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();
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。
我正在使用 Entity Framework(我认为是 V5)并且目前正在尝试向 table 添加一个新行。我希望添加的 table 有一个基于值 "PRN" 的复合主键(基本上是一个唯一的客户 ID)和一个关联的序列号。每次更新此 table 中的信息时,我们都会为 PRN 插入一个新行并增加序列号。序列号未定义为数据库中的自动递增值或 IDENTITY,因为它不是唯一的 - 序列号仅在每个 PRN 中是唯一的。
当我执行以下代码时,我得到一个 InvalidOperationException:"The property 'DDIPhasedPayment_Seq_Num' is part of the object's key information and cannot be modified."
EF 似乎不介意我只修改主键的 PRN 部分并保存记录(这导致 Seq_Num 的默认值为零)但是当我尝试修改PK的另一部分。如何在不扰乱 EF 的情况下为此 table 创建并添加一行?
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();
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。