一个Entity Framework Core表的两个外键

时间:2017-11-24 21:23:28

标签: c# entity-framework model-view-controller fluent-interface

我正在使用asp core 2.0开发语言词典。我不知道该怎么做  正确设计我的数据库。我遇到了类似的问题:How to design a database for translation dictionary?

我决定创建一个如下图所示的数据库:

database structure that i wanna realize in ef core

但我不知道如何用实体框架核心2.0实现这种结构。

Word实体

    public class Word
    {
      public Word()
        {
          Translations = new HashSet<Translation>();
        }
      [Key]
      public Guid WordId { get; set; }
      [Required]
      public Guid LangCodeId { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
        "CA2227:CollectionPropertiesShouldBeReadOnly")]
       public virtual ICollection<Translation> Translations { get; set; }


}

翻译实体

   public class Translation
{
    [Key]
    public Guid TranslationId { get; set; }
    public Guid WordId1 { get; set; }
    public Guid WordId2 { get; set; }

    //[ForeignKey("WordId1,WordId2")]
    public Word Words { get; set; }

}

流畅的API

  modelBuilder.Entity<Translation>()
            .HasOne(w => w.Words)
            .WithMany(m => m.Translations)
            .HasForeignKey(fk => new { fk.WordId1, fk.WordId2 });

当我尝试添加迁移时,我收到错误:

   The relationship from 'Translation.Words' to 'Word.Translations' with 
   foreign key properties {'WordId1' : Guid, 'WordId2' : Guid} cannot target 
   the primary key {'WordId' : Guid} because it is not compatible. Configure 
   a principal key or a set of compatible foreign key properties for this 
   relationship.

1 个答案:

答案 0 :(得分:0)

我找到了解决方案

public partial class Translation
{
    public Guid DerivedId { get; set; }
    public Guid? Word1 { get; set; }
    public Guid? Word2 { get; set; }

    public Word Word1Navigation { get; set; }
    public Word Word2Navigation { get; set; }
}



public partial class Word
{
    public Word()
    {
        TranslationWord1Navigation = new HashSet<Translation>();
        TranslationWord2Navigation = new HashSet<Translation>();
    }

    public Guid Id { get; set; }

    public ICollection<Translation> TranslationWord1Navigation { get; set; }
    public ICollection<Translation> TranslationWord2Navigation { get; set; }
}

Fluent API

        modelBuilder.Entity<Translation>(entity =>
        {
            entity.HasKey(e => e.DerivedId);

            entity.Property(e => e.DerivedId).ValueGeneratedNever();

            entity.HasOne(d => d.Word1Navigation)
                .WithMany(p => p.TranslationWord1Navigation)
                .HasForeignKey(d => d.Word1)
             .HasConstraintName("FK__DerivedTa__Word1__5EBF139D");

            entity.HasOne(d => d.Word2Navigation)
                .WithMany(p => p.TranslationWord2Navigation)
                .HasForeignKey(d => d.Word2)
                .HasConstraintName("FK__DerivedTa__Word2__5FB337D6");
        });

        modelBuilder.Entity<Word>(entity =>
        {
            entity.Property(e => e.Id)
                .HasColumnName("id")
                .ValueGeneratedNever();
        });