Entity Framework 并插入标识列
Entity Framework and insert with an Identity column
我正在使用 Entity Framework 进行 Windows Forms 项目。我的数据库有两个 table,Table A
和 Table B
。
Table A
有一个标识列 PkId
。 Table B 也有一个标识列 (PkId
) 和 FkIdA
这是 table A 的外键。
如果我在 table A 中添加一个新行,它的 PkId 为 0。然后我将在 table B 中添加一个新行,它指向 [=] 中的新行56=] A. 这是预期的。
现在,如果用户在 tableA 中添加另一行,它将获得相同的 Id (0)。然后他将在 table B 中添加更多行指向相同的 Id。一旦我调用 DbContext.SaveChanges()
,应用程序就会崩溃,因为 Table A.PkId 不是唯一的(有道理)。
我之前使用过 Dataset
,它给出了本地 ID,从 0 或 -1 开始递减(因此 -1、-2、-3 等)。我怎样才能确保实体遵循相同的规则?
我不在每次插入之间调用 SaveChanges
以检索数据库给出的真实 PkId
的原因是因为我想提供删除对用户(因此,一旦他提交,他不应该能够恢复已经完成的操作)。
编辑
我添加了一张我的模特的照片。我还去检查了 table A (Transaction
) 的 PkId
列,它存储的生成模式是 Identity,正如预期的那样。
编辑 2
实体自动生成的模型包含对 Transaction
内付款的引用
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Payment> Payments { get; set; }
现在我添加一个新的 WholeTransaction
的方式,基本上是一个有 2 笔付款的交易是这样的:
var newWholeTransaction = new AddNewTransaction();
newWholeTransaction.ShowDialog();
if (!newWholeTransaction.WasSaved)
return;
var transaction = DbContext.Transactions.Add(newWholeTransaction.WholeTransaction.Transaction);
newWholeTransaction.WholeTransaction.PaymentJeanne.FkIdTransaction = transaction.Id;
newWholeTransaction.WholeTransaction.PaymentLuis.FkIdTransaction = transaction.Id;
DbContext.Payments.Add(newWholeTransaction.WholeTransaction.PaymentJeanne);
DbContext.Payments.Add(newWholeTransaction.WholeTransaction.PaymentLuis);
像往常一样,我对这些东西使用导航属性
public class MyEntity
{
[Key]
public int Id { get; set; }
public int OtherId { get; set; }
public OtherEntity Other { get; set; }
}
Entity Framework 管理 PkId,而不是你。
var transaction1 = new Transaction();
transaction1.Name = "tr1";
var transaction2 = new Transaction();
transaction2.Name = "tr2";
var payment1 = new Payment();
payment1.Amount = 1;
payment1.Transaction = transaction1;
var payment2 = new Payment();
payment2.Amount = 1;
payment2.Transaction = transaction2;
context.Transactions.Insert(transaction1);
context.Transactions.Insert(transaction2);
context.Payments.Insert(payment1);
context.Payments.Insert(payment2);
context.SaveChanges();
另一种方式;
transaction1.Payments.Add(payment1);
transaction2.Payments.Add(payment2);
我正在使用 Entity Framework 进行 Windows Forms 项目。我的数据库有两个 table,Table A
和 Table B
。
Table A
有一个标识列 PkId
。 Table B 也有一个标识列 (PkId
) 和 FkIdA
这是 table A 的外键。
如果我在 table A 中添加一个新行,它的 PkId 为 0。然后我将在 table B 中添加一个新行,它指向 [=] 中的新行56=] A. 这是预期的。
现在,如果用户在 tableA 中添加另一行,它将获得相同的 Id (0)。然后他将在 table B 中添加更多行指向相同的 Id。一旦我调用 DbContext.SaveChanges()
,应用程序就会崩溃,因为 Table A.PkId 不是唯一的(有道理)。
我之前使用过 Dataset
,它给出了本地 ID,从 0 或 -1 开始递减(因此 -1、-2、-3 等)。我怎样才能确保实体遵循相同的规则?
我不在每次插入之间调用 SaveChanges
以检索数据库给出的真实 PkId
的原因是因为我想提供删除对用户(因此,一旦他提交,他不应该能够恢复已经完成的操作)。
编辑
我添加了一张我的模特的照片。我还去检查了 table A (Transaction
) 的 PkId
列,它存储的生成模式是 Identity,正如预期的那样。
编辑 2
实体自动生成的模型包含对 Transaction
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Payment> Payments { get; set; }
现在我添加一个新的 WholeTransaction
的方式,基本上是一个有 2 笔付款的交易是这样的:
var newWholeTransaction = new AddNewTransaction();
newWholeTransaction.ShowDialog();
if (!newWholeTransaction.WasSaved)
return;
var transaction = DbContext.Transactions.Add(newWholeTransaction.WholeTransaction.Transaction);
newWholeTransaction.WholeTransaction.PaymentJeanne.FkIdTransaction = transaction.Id;
newWholeTransaction.WholeTransaction.PaymentLuis.FkIdTransaction = transaction.Id;
DbContext.Payments.Add(newWholeTransaction.WholeTransaction.PaymentJeanne);
DbContext.Payments.Add(newWholeTransaction.WholeTransaction.PaymentLuis);
像往常一样,我对这些东西使用导航属性
public class MyEntity
{
[Key]
public int Id { get; set; }
public int OtherId { get; set; }
public OtherEntity Other { get; set; }
}
Entity Framework 管理 PkId,而不是你。
var transaction1 = new Transaction();
transaction1.Name = "tr1";
var transaction2 = new Transaction();
transaction2.Name = "tr2";
var payment1 = new Payment();
payment1.Amount = 1;
payment1.Transaction = transaction1;
var payment2 = new Payment();
payment2.Amount = 1;
payment2.Transaction = transaction2;
context.Transactions.Insert(transaction1);
context.Transactions.Insert(transaction2);
context.Payments.Insert(payment1);
context.Payments.Insert(payment2);
context.SaveChanges();
另一种方式;
transaction1.Payments.Add(payment1);
transaction2.Payments.Add(payment2);