簡體   English   中英

實體框架錯誤地跨多個列強制執行唯一約束

[英]Entity Framework is incorrectly enforcing a unique constraint across multiple columns

編輯:我很抱歉我浪費了你的時間。 調試導致此問題時,我錯過了一行代碼。 有人提出了一個條件,即檢查數據庫中是否已存在該名稱,如果存在,則拋出此異常。

我首先使用實體​​框架代碼,並且我有一個實體,其中包含一個跨兩列的唯一約束的索引,如下面的代碼所示。 (我將屬性的名稱更改為通用的東西,以便不顯示我公司的任何代碼庫)

[Table("TB_Table")]
public class Table : IEntity
{
    [Key]
    [Column("TBT_RID")]
    public int Id { get; set; }

    [ForeignKey("Something")]
    [Index("idxSomethingTableName", 1, IsUnique = true)]
    [Column("TBT_SOS_RID")]
    public int SomethingId { get; set; }

    [Index("idxSomethingTableName", 2, IsUnique = true)]
    [MaxLength(255)]
    [Column("TBT_Name")]
    public string Name { get; set; }

    // Navigation properties
    [JsonIgnore]
    public virtual Something Something { get; set; }

    [InverseProperty("Table")]
    [JsonIgnore]
    public virtual ICollection<AssetTag> ObjectTables { get; set; }

}

在SQL中插入記錄時,正在強制執行唯一約束。 然后,當試圖通過Entity Framework輸入記錄時,它告訴我它不能添加具有不同“SomethingId”值的記錄,但是與另一個記錄具有相同的“Name”。

例如,我可以使用SQL插入這些記錄:

insert into TB_Table (TBT_SOS_RID, TGT_Name) values
(1, 'A'),
(1, 'B'),
(30, 'A')

但是我不能用SQL添加另一個(1,'A')。 好,太棒了。 約束正常工作。 現在,如果我嘗試使用具有值(30,'B')的實體框架插入記錄,我應該能夠這樣做,因為TBT_SOS_RID(C#中的SomethingId)是不同的。 相反,我得到一個InvalidOperationException,消息“無效表,表已存在”。 在調用SaveChanges()方法之前,會在DbSet.Add()方法上發生這種情況。

你能想到為什么實體框架會認為這是違反SQL的唯一約束的原因嗎?

似乎Kryptos在這里回答了關於如何使用外鍵處理復合索引的類似問題:具有外鍵的復合指數

我沒有對該解決方案進行測試,但它可能有助於引導您走上正確的道路, 在同一問題中擴展答案

你裝飾名字如下:

[Index("idxSomethingTableName", 2, IsUnique = true)]
[MaxLength(255)]
[Column("TBT_Name")]
public string Name { get; set; }

就實體而言,您已聲明Name必須是唯一的,因此,您不能輸入兩個相同的名稱。

暫無
暫無

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

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