c# - 实体框架并插入标识列
问题描述
我正在为 Windows 窗体项目使用实体框架。我的数据库有两个表,Table A
并且Table B
.
Table A
有一个标识列PkId
。表 B 也有一个标识列 ( PkId
),也是FkIdA
表 A 的外键。
如果我在表 A 中添加一个新行,它的 PkId 为 0。然后我将在表 B 中添加一个新行,它指向表 A 中的新行。这是预期的。
现在,如果用户在表 A 中添加另一行,它将获得相同的 Id (0)。然后他将在表 B 中添加更多指向相同 ID 的行。一旦我调用DbContext.SaveChanges()
,应用程序将崩溃,因为表 A.PkId 不是唯一的(有意义)。
我以前使用Dataset
过,它给出了本地 ID,从 0 或 -1 开始并递减(如 -1、-2、-3 等)。如何确保实体遵循相同的规则?
我不在SaveChanges
每个插入之间调用以检索PkId
数据库给出的真实值的原因是因为我想提供删除对用户所做的更改的可能性(因此,一旦他提交,他不应该能够恢复已完成的操作)。
编辑
我添加了我的模型的图片。我还检查了PkId
表 A ( Transaction
) 的列,其存储的生成模式是 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);
解决方案
实体框架管理 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);
推荐阅读
- amazon-ec2 - AWS - 网络性能与 aws amazon 提到的不相符
- python - BeautifulSoup 可能无法解析 html 文档中的表格吗?
- android - Firebase 实时数据库按子查询和分页结果
- ios - 将不同的单元格对象插入 IndexPath
- python - 我如何使用 django 进行此查询
- node.js - 如何在不知道服务器上的数据量的情况下知道要发出多少请求
- xamarin - 来自服务器的无效状态。可能伪造!Xamarin.Auth 中的错误
- android - Android Studio - 如何摆脱不同大小写的重复包?
- c# - 如何使用在 C# 中的方法之外实例化的变量?
- javascript - Vue.JS:为什么父元素不会收到事件?父级必须是自定义组件吗?