2016-08-02 100 views
1

我有兩個表,其中一個與其他相關。 第一個表同一個表和外鍵上的兩個主鍵

public class Text 
    { 
    [Key] 
    [Column(Order = 1)] 
    [Required] 
    [MinLength(7)] 
    [MaxLength(7)] 
    public string Fieldname { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [Required] 
    public virtual Language Language { get; set; } 

    [MaxLength(50)] 
    [MinLength(1)] 
    [Required] 
    public string Description { get; set; } 
    } 

,第二個表:

public class Language 
    { 
    [Key] 
    [Required] 
    [MaxLength(2), MinLength(2)] 
    public string Code { get; set; } 
    [Required] 
    public string Country { get; set; } 
    } 

種子數據看起來如下:

context.Language.AddOrUpdate(
     new Language() {Code = "DE", Country = "German"}, 
     new Language() {Code = "EN", Country = "English"}); 

context.Text.AddOrUpdate(
     new Text { Fieldname = "TEXT001", Description = "Server", Language = context.Language.First(e => e.Code == "EN") }, 
     new Text { Fieldname = "TEXT001", Description = "Server", Language = context.Language.First(e => e.Code == "DE") } 
    ); 

我更新數據庫,並得到了以下錯誤消息:

System.Data.Entity.Core .UpdateException:更新條目時發生錯誤。詳情請參閱內部例外。 ---> System.Data.SqlClient.SqlException:違反PRIMARY KEY約束'PK_dbo.Texts'。無法在對象'dbo.Texts'中插入重複鍵。重複的鍵值是(TEXT001)。

出了什麼問題?

+2

是的,但與字段'Fieldname'和'Language'結合使用。請查看種子數據,那麼你應該明白我的意思。 –

+0

@zero_coding - 不確定,但我認爲你應該指定'語言''鍵'是一個外鍵 - '[Key,ForeignKey(「Language」),Column(Order = 2)]' –

+0

設置複雜屬性'語言是否有效? –

回答

1

@IvanStoev答案是正確的。但我想展示另一種選擇。我建議使用Fluent API來映射你的類。對我來說,這樣,你的模型將會更加乾淨,映射也很容易理解。

文本模型和映射它:

public class Text 
{ 
    public string FieldName { get; set; } 
    public string LanguageCode { getl set; } // Add this foriegn key property 
    public string Description { get; set; } 

    // Navigation properties 
    public virtual Language Language { get; set; } 
} 

internal class TextMap 
    : EntityTypeConfiguration<Text> 
{ 
    public TextMap() 
    { 
     // Primary key 
     this.HasKey(m => new { m.FieldName, m.LanguageCode }); 

     this.Property(m => m.FieldName) 
       .HasMaxLength(7) 
       .IsFixedLength(); 

     this.Property(m => m.LanguageCode) 
       .HasMaxLength(2) 
       .IsFixedLength(); 

     // Properties 
     this.Property(m => m.Description) 
      .IsRequired() 
      .HasMaxLength(50);      

     // Relationship mappings 
     this.HasRequired(m => m.Language) 
      .WithMany() 
      .HasForeignKey(m => m.LanguageCode) 
      .WillCascadeOnDelete(false); 
    } 
} 

語言模型和映射它:

public class Language 
{ 
    public string Code { get; set; } 
    public string Country { get; set; } 
} 

internal class LanguageMap 
    : EntityTypeConfiguration<Language> 
{ 
    public LanguageMap() 
    { 
     // Primary key 
     this.HasKey(m => m.Code); 

     this.Property(m => m.Code) 
       .HasMaxLength(2) 
       .IsFixedLength(); 

     // Proeprties 
     this.Property(m => m.Country) 
      .IsRequired(); 
    } 
} 

那麼你應該重寫的DbContext的OnModelCreating方法並添加您的映射關係:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new TextMap()); 
    modelBuilder.Configurations.Add(new LanguageMap()); 
} 
+0

那麼在導航屬性中,我不必再設置'[Key]'了? –

+0

在導航proeprty中有主鍵,但如果您使用Fluent API @zero_coding –

+0

aha ok,則不使用任何屬性。我生病了,讓你知道。 –

1

我不認爲你可以定義導航屬性的PK的一部分,因此EF乾脆忽略了Language財產您ColumnKey屬性,以PK爲剛Fieldname結束了。

你需要明確包括FK場這樣的:

public class Text 
{ 
    [Key] 
    [Column(Order = 1)] 
    [Required] 
    [MinLength(7)] 
    [MaxLength(7)] 
    public string Fieldname { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [Required] 
    [MaxLength(2), MinLength(2)] 
    public string LanguageCode { get; set; } 

    [ForeignKey("LanguageCode")] 
    public virtual Language Language { get; set; } 

    [MaxLength(50)] 
    [MinLength(1)] 
    [Required] 
    public string Description { get; set; } 
} 
相關問題