根據其他問題(here和here),可以通過捕獲拋出的異常並檢查它是否爲InnerException
來捕獲Entity Framework 6中的唯一密鑰違規。處理EntityFramework核心中的重複密鑰違規
當重複組數據調用DbContext.SaveChanges()
,拋出一個異常,但它是一個相當標準的InvalidOperationException
,它的InnerException
是null
。
如何檢測實體框架核心中的重複鍵違規?
有更多的上下文(雙關語意)更新
具體違反我試圖趕上/檢測增加是當兩個實體(團隊和用戶),由多到加入之間的聯繫多種關係。
System.InvalidOperationException:無法跟蹤實體類型'TeamUser'的實例,因爲具有相同鍵的此類型的另一個實例已被跟蹤。添加新實體時,對於大多數鍵類型,如果未設置鍵(即,如果鍵屬性被指定爲其類型的默認值),則將創建唯一的臨時鍵值。如果您明確地爲新實體設置關鍵值,請確保它們不與現有實體衝突或爲其他新實體生成的臨時值衝突。在附加現有實體時,確保只有具有給定鍵值的一個實體實例附加到上下文。
用戶實體類:
public class User
{
[Key]
public string Name { get; set; }
public ICollection<TeamUser> TeamUsers { get; set; }
}
團隊實體類:
public class Team
{
[Key]
public string Id { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Template> Templates { get; set; }
public ICollection<Checklist> Checklists { get; set; }
public ICollection<TeamUser> TeamUsers { get; set; }
}
TeamUser實體類:
public class TeamUser
{
public string TeamId { get; set; }
public Team Team { get; set; }
public string UserName { get; set; }
public User User { get; set; }
}
個
我DbContext
子類配置團隊和用戶之間的許多一對多的關係:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var teamUserEntity = modelBuilder.Entity<TeamUser>();
teamUserEntity
.HasKey(tu => new { tu.TeamId, tu.UserName });
teamUserEntity
.HasOne(tu => tu.Team)
.WithMany(t => t.TeamUsers)
.HasForeignKey(tu => tu.TeamId);
teamUserEntity
.HasOne(tu => tu.User)
.WithMany(u => u.TeamUsers)
.HasForeignKey(tu => tu.UserName);
}
EF核心已經產生了TeamUser
表如下:
CREATE TABLE "TeamUser" (
"TeamId" TEXT NOT NULL,
"UserName" TEXT NOT NULL,
CONSTRAINT "PK_TeamUser" PRIMARY KEY ("TeamId", "UserName"),
CONSTRAINT "FK_TeamUser_Teams_TeamId" FOREIGN KEY ("TeamId") REFERENCES "Teams" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_TeamUser_Users_UserName" FOREIGN KEY ("UserName") REFERENCES "Users" ("Name") ON DELETE CASCADE
);
CREATE INDEX "IX_TeamUser_UserName" ON "TeamUser" ("UserName");
你是否在你的數據庫上下文中設置了獨特的約束條件? –
我的意思是這樣的:entity.HasAlternateKey(p => new {p.ProductName})。HasName(「U_ProductName」); –
@ H.Herzl請檢查更新的問題,我添加了相關的實體類和'OnModelCreating'方法。 –