我很难将数据库设置为适合0到多个(不是1到多个)。我有表示给定单词的对象。每个词中都有WordModel表示该词的同义词,如名词、副词等。数据库中缓慢地填写了对在线同义词表api的查询。只有在请求给定单词的同义词时才查询api。我的wordmodel类:

[Key]
public int Id { get; set; }
public string Word { get; set; }
public WordType Traits { get; set; }
public bool SynonymsQueried { get; set; }
public virtual ICollection<WordModel> NounSynonyms { get; set; }
public virtual ICollection<WordModel> VerbSynonyms { get; set; }
public virtual ICollection<WordModel> AdjectiveSynonyms { get; set; }
public virtual ICollection<WordModel> AdverbSynonyms { get; set; }

我使用ICollection<WordModel>检查这个词是否被查询过。这样我就可以用SynonymsQueried对象填充同义词集合,同时跟踪这些词本身是否被查询过(否则我将递归查询很长一段时间)。任何WordModel都没有理由知道它可能包含在任何同义词列表中,我只想跟踪它自己的个人同义词(在具体查询之前,这些同义词将保持为空)。
从该模型生成的数据库是一个具有1对多关系的单表。每个WordModel都有一个引用父WordModel的id,如果多个WordModel对象在其同义词集合中包含另一个WordModel对象,这就没有意义。
我可以让这种关系变得多对多,但我不知道如何先使用代码来强制这种关系。还需要注意的是,我没有模型优先或数据库优先EF的经验,我希望这是可能的代码优先。

最佳答案

您需要的是四个多对多的无反向导航属性的自引用关系。请尝试以下操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<WordModel>()
      .HasMany(x => x.NounSynonyms).WithMany()
      .Map(x => x.ToTable("WordModelNounSynonym")
          .MapLeftKey("WordModelId").MapRightKey("SynonymId"));
  modelBuilder.Entity<WordModel>()
      .HasMany(x => x.VerbSynonyms).WithMany()
      .Map(x => x.ToTable("WordModelVerbSynonym")
          .MapLeftKey("WordModelId").MapRightKey("SynonymId"));
  modelBuilder.Entity<WordModel>()
      .HasMany(x => x.AdjectiveSynonyms).WithMany()
      .Map(x => x.ToTable("WordModelAdjectiveSynonym")
          .MapLeftKey("WordModelId").MapRightKey("SynonymId"));
  modelBuilder.Entity<WordModel>()
      .HasMany(x => x.AdverbSynonyms).WithMany()
      .Map(x => x.ToTable("WordModelAdverbSynonym")
          .MapLeftKey("WordModelId").MapRightKey("SynonymId"));
}

09-26 03:15