EF 0到许多代码第一次数据库设置

问题描述:

我无法正确设置我的数据库为0到很多(不是1到很多)。我有WordModel代表给定单词的对象。在每个代表该词的同义词ICollection<WordModel>作为名词,副词等。数据库缓慢地填写查询到在线词库API。只有在请求给定单词的同义词时才会查询API。我WordModel类:EF 0到许多代码第一次数据库设置

[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; } 

我用SynonymsQueried检查,如果这个词已经被查询或不是。这样我就可以用WordModel对象填充同义词集合,同时跟踪这些单词本身是否被查询(否则我将递归查询可能很长时间)。任何WordModel没有任何理由知道它可能包含在其中的任何同义词列表,我只想跟踪它自己的个人同义词(在特定查询之前它们将保持为空或空)。

从此模型生成的数据库是一个具有1对多关系的单个表。每WordModel有一个Id引用WordModel如果多个WordModel对象在其同义词集中包含另一个WordModel,则这是不合理的。 Screenshot of Database Schema

我可以建立多对多的关系,但我不知道如何使用Code First强制执行此操作。同样重要的是要注意,我没有使用Model First或Database First EF的经验,我希望Code First可以这样做。

你想要的是四个多对多的自引用关系,没有反向导航属性。请尝试以下操作:

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")); 
} 
+0

有趣的解决方案,它解决了!谢谢! –