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
,则这是不合理的。
我可以建立多对多的关系,但我不知道如何使用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"));
}
有趣的解决方案,它解决了!谢谢! –