在实体框架中,当我想指定一个实体有许多其他类型的实体时,它似乎向我做了一些事情。
例如,让我说我有一个关键字实体,在我的应用程序的几个地方使用。所有关键字都是唯一的,但在我的其他实体上,我想要附加多个关键字,所以对我来说这是有道理的:
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
放在Page
和Search
个实体上,我这样做:
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字段的关系时,这感觉有些落后。
我觉得我做错了什么,因为我应该能够通过查看我的搜索来看到这种关系。页面类。
我很抱歉这个基本问题,但由于某些原因,我已经阅读了文档而我并没有完全理解它。
答案 0 :(得分:1)
在一对多关联中,许多方始终引用一个方。你还怎么实现呢?如果Page
的{{1}}为FK,那么它只能有一个关键字。
此外,即使关键字属于无数页面,也并不意味着您始终必须通过一个关键字访问所有这些页面。只有在您搜索使用特定关键字的网页时,您才会这样做。
但现在回到你的模特。你不能在这里有一对多的关联。这意味着任何关键字只能属于一个KeywordId
或一个Page
。如果您按照建议反转关系,则Search
或Page
只能拥有一个关键字(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
,用于记录多对多关联。