[英]EF7 with SqlServer: violation of UNIQUE KEY constraint with composite key
我有一個表DataSourceDefinition,用於存儲有關不同類型的數據源的信息。 由於自然為每個數據源分配了一個GUID,因此我將其用作主鍵。
每個數據源類型都具有編號為1、2的某些設置。我想在第二個表DataSourceSettingDefinition中存儲有關這些設置的信息(名稱,數據類型,EditorType ...)。 我認為使用復合鍵是很自然的,該復合鍵包括用於數據源類型的唯一GUID,然后是外鍵,以及在給定數據源中唯一的Integer 1,2 ...(SettingID)。類型。 兩者的結合將永遠是唯一的。
當我嘗試使用以下鍵插入兩個數據源設置定義時:
DataSourceDefinitionID-SettingID
5E880F15-80CA-45EC-AD5A-6D406B06AB08-1
5E880F15-80CA-45EC-AD5A-6D406B06AB08-2
我收到以下錯誤:
System.Data.SqlClient.SqlException: Violation of UNIQUE KEY
constraint 'AK_DataSourceSettingDefinition_DataSourceDefinitionID'. Cannot
insert duplicate key in object 'dbo.DataSourceSettingDefinition'. The
duplicate key value is (5e880f15-80ca-45ec-ad5a-6d406b06ab08). at ...
為什么這不可能呢?
這是我的代碼優先模型:
public class DataSourceDefinition
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid ID { get; set; }
[Required]
[StringLength(50)]
public string NameEn { get; set; }
[StringLength(300)]
public string DescriptionEn { get; set; }
...
}
public class DataSourceSettingDefinition
{
[Key, Column(Order = 1)]
public Guid DataSourceDefinitionID { get; set; }
[Key, Column(Order = 2)]
public int SettingID { get; set; }
[Required]
[StringLength(50)]
public string NameEn { get; set; }
[StringLength(300)]
public string DescriptionEn { get; set; }
[Required]
public int DataType { get; set; }
...
}
更新資料
我忘記在OnModelCreating中顯示代碼。 EF7文檔的預發行版本說明
您仍然可以將注釋添加到實體類中,以便其他框架(例如ASP.NET MVC)使用它們,但是實體框架將不處理這些注釋。
這就是為什么我將數據注釋保留在原處並添加以下內容的原因
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<DataSourceSettingDefinition>().Key(m => new { m.DataSourceDefinitionID, m.SettingID });
}
事實證明,這些聲明中的數據注釋存在問題:
[Key, Column(Order = 1)]
public Guid DataSourceDefinitionID { get; set; }
[Key, Column(Order = 2)]
public int SettingID { get; set; }
如果我刪除了數據注釋,而僅將主鍵構建留給了流暢的API,它將按預期工作。 盡管預發布文檔說EF7不會處理數據注釋,但似乎仍然有副作用。 有了數據注釋,似乎可以生成主鍵和替代鍵,但不能生成復合鍵。 在那種情況下,當然必須以相同的GUID插入兩個DataSourceSettingDefinitions。
在EF 7中
不能使用數據注釋配置唯一約束。 您必須使用流暢的API進行配置。
如何配置
class MyContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.HasAlternateKey(e => e.EmployeeCode)
.HasName("AlteranteKey_EmployeeCode");
}
}
class Employee
{
[Key]
public int EmployeeId { get; set; }
public string Name { get; set; }
public string EmployeeCode { get; set; }
public DateTime DateOfBirth { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.