簡體   English   中英

實體框架並插入標識列

[英]Entity Framework and insert with an Identity column

我正在為 Windows Forms 項目使用實體框架。 我的數據庫有兩個表, Table ATable 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的原因是因為我想提供刪除對用戶所做的更改的可能性(因此,一旦他提交,他不應該能夠恢復已經完成的事情)。

編輯

我添加了一張我的 model 的圖片。 我還檢查了表 A ( Transaction ) 的PkId列,它存儲的生成模式是 Identity,正如預期的那樣。

在此處輸入圖像描述

編輯 2

來自實體的自動生成的 model 包含對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);

像往常一樣,我對這些東西使用導航屬性

public class MyEntity
{
    [Key]
    public int Id { get; set; }

    public int OtherId { get; set; }
    public OtherEntity Other { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM