首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EF核心一对多关系HasOne().WithMany() vs HasMany().WithOne()

EF核心一对多关系HasOne().WithMany() vs HasMany().WithOne()
EN

Stack Overflow用户
提问于 2016-09-30 00:38:00
回答 2查看 47.1K关注 0票数 25

假设我有以下两种模型:

代码语言:javascript
运行
复制
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

现在,如果我想在DbContext中配置模型关系,那么在以下几个方面有什么不同:

代码语言:javascript
运行
复制
modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts);

代码语言:javascript
运行
复制
modelBuilder.Entity<Blog>()
            .HasMany(b => b.Posts)
            .WithOne(p => p.blog);

如果有什么不同,那是什么呢?我应该同时写,还是只写一封?

作为附带说明:,我必须定义外键吗?根据我对数据库的了解,没有外键就不能创建关系,但是EF并不要求您有外键字段。那么EF如何处理不知道外键的关系呢?它会导致性能下降还是错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 01:21:42

没错,您可以在数据库中不使用外键在DbContext中创建关系。

另外:

WithOne:一对一的关系在双方都有一个引用导航属性。它们遵循与一对多关系相同的约定,但在外键属性上引入了唯一的索引,以确保每个主体只关联一个依赖项。

多到多:没有实体类来表示联接表的关系还不受支持。但是,您可以通过为联接表包括一个实体类和映射两个单独的一对多关系来表示多到多的关系。

您只需要定义一个关系,因为在某些情况下,您将为没有导航属性(一个或集合)的父子关系创建一个关系。

对于您的示例:您为博客->文章添加了一个关系,因为您在两个对象中都有导航属性,这两行的内容是相同的,但方式不同:

  • 博客->帖子(父->子)
  • 发布->博客(子女->家长)
票数 11
EN

Stack Overflow用户

发布于 2016-11-23 11:00:13

您可以在没有外键属性的情况下定义模型。但是,实体框架将引入一个影子属性,该属性将位于数据库中。

根据文档

虽然建议在依赖实体类中定义外键属性,但它并不是必需的。如果没有找到外键属性,则将引入名为<navigation property name><principal key property name>的影子外键属性(有关更多信息,请参见阴影特性 )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39781996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档