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

时间:2015-07-19 20:56:43

标签: c# database entity-framework

我无法正确设置数据库0到多(不是1到多)。我有WordModel个对象代表一个给定的单词。在每个中ICollection<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; }

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

从此模型生成的数据库是具有1对多关系的单个表。每个WordModel都有一个引用 WordModel的ID,如果多个WordModel对象在其同义词集合中包含另一个WordModel,则无法理解。{ {0}}

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

1 个答案:

答案 0 :(得分:1)

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

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