[英]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的唯一約束的原因嗎?
你裝飾名字如下:
[Index("idxSomethingTableName", 2, IsUnique = true)]
[MaxLength(255)]
[Column("TBT_Name")]
public string Name { get; set; }
就實體而言,您已聲明Name必須是唯一的,因此,您不能輸入兩個相同的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.