一对多的关系:为什么ID字段会进入其他实体?

时间:2015-08-29 21:47:22

标签: entity-framework

在实体框架中,当我想指定一个实体有许多其他类型的实体时,它似乎向我做了一些事情。

例如,让我说我有一个关键字实体,在我的应用程序的几个地方使用。所有关键字都是唯一的,但在我的其他实体上,我想要附加多个关键字,所以对我来说这是有道理的:

class Page
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Keyword> Keywords { get; set; }
}

class Search
{
    public int ID { get; set; }
    public DateTime Date { get; set; }

    public virtual ICollection<Keyword> Keywords { get; set; }
}

class Keyword
{
    public int ID { get; set; }
    public string Name { get; set; }
}

然而,当我这样做时,外键被添加到Keyword表中,而我希望它在实际实体上,所以我可以在数据库中查看它并查看关键字的小列表,而不是查看关键字并且看到了大量的页面结果。

因此,要让实体框架将Keyword_ID放在PageSearch个实体上,我这样做:

class Page
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Search
{
    public int ID { get; set; }
    public DateTime Date { get; set; }
}

class Keyword
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Page> Pages { get; set; }
    public virtual ICollection<Search> Searches { get; set; }
}

当我在实体上指定没有在数据库表中获取外来ID字段的关系时,这感觉有些落后。

我觉得我做错了什么,因为我应该能够通过查看我的搜索来看到这种关系。页面类。

我很抱歉这个基本问题,但由于某些原因,我已经阅读了文档而我并没有完全理解它。

1 个答案:

答案 0 :(得分:1)

在一对多关联中,许多方始终引用一个方。你还怎么实现呢?如果Page的{​​{1}}为FK,那么它只能有一个关键字。

此外,即使关键字属于无数页面,也并不意味着您始终必须通过一个关键字访问所有这些页面。只有在您搜索使用特定关键字的网页时,您才会这样做。

但现在回到你的模特。你不能在这里有一对多的关联。这意味着任何关键字只能属于一个KeywordId或一个Page。如果您按照建议反转关系,则SearchPage只能拥有一个关键字(Search引用的关键字)。

实际上,您正在处理多对多关联,好消息是,Keyword_ID保持不变。

将其建模为多对多并不会改变模型的外观(第一个版本),但映射不同:

Keyword

这将在您的数据库中生成两个联结表modelBuilder.Entity<Page>().HasMany(p => p.Keywords) .WithMany() .Map(m => { m.ToTable("PageKeyword"); m.MapLeftKey("PageID"); m.MapRightKey("KeywordID"); }); modelBuilder.Entity<Search>().HasMany(s => s.Keywords) .WithMany() .Map(m => { m.ToTable("SearchKeyword"); m.MapLeftKey("SearchID"); m.MapRightKey("KeywordID"); }); PageKeyword,用于记录多对多关联。