簡體   English   中英

帶有SqlServer的EF7:違反帶有復合鍵的UNIQUE KEY約束

[英]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.

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