我很难将数据库设置为适合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"));
}