Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心一对多关系HasOne().WithMany()与HasMany().WithOne()比较_C#_Entity Framework_Asp.net Core - Fatal编程技术网

C# EF核心一对多关系HasOne().WithMany()与HasMany().WithOne()比较

C# EF核心一对多关系HasOne().WithMany()与HasMany().WithOne()比较,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,假设我有以下两种型号: 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 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; }
}
公共类博客
{
public int BlogId{get;set;}
公共字符串Url{get;set;}
公共列表发布{get;set;}
}
公营职位
{
公共int PostId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公共博客Blog{get;set;}
}
现在,如果我想在DbContext中配置模型关系,那么以下两者之间有什么区别吗:

modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts);
modelBuilder.Entity()
.HasOne(p=>p.Blog)
.有许多(b=>b职位);

modelBuilder.Entity()
.HasMany(b=>b.Posts)
.有一个(p=>p.blog);
如果有差异,那是什么?我应该两个都写还是只写一个


作为旁注:我必须定义外键吗?根据我对数据库的了解,如果没有外键,您无法创建关系,但EF不要求您有外键字段。那么EF如何在不知道外键的情况下处理关系呢?它会导致性能下降或出现错误吗?

没错,您可以在DbContext中创建关系,而不需要数据库中的外键

此外:

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

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

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

对于您的示例:您为Blog->Posts添加了一个关系,因为这两个对象中都有导航属性,所以这两行内容相同,但方式不同:

  • 博客->帖子(父->子)
  • 帖子->博客(子->父)

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

根据报告:

虽然建议在依赖实体类中定义外键属性,但这不是必需的。如果未找到外键属性,将引入名为
的卷影外键属性(有关详细信息,请参阅)


那么你是说这两种方法之间没有区别,我可以用同样的方法使用模型吗?但是使用HasOne()。WithMany更好?在这种情况下,没有更好的方法,它们只是创建两个对象之间关系的不同方法,通常是从子对象到父对象的映射“您可以在数据库中没有外键的情况下在DbContext中创建关系”。这是不正确的。EF将引入一个影子属性,该属性不在您的模型中,但将在数据库中。感谢您的反馈,无论如何,我的意思是,从应用程序方面来说,我们不知道数据库中是否存在该关系的约束,有时有人问我们是否需要首先从数据库中定义关系side@H.Herzl恐怕EFCore确实假设数据库中始终存在约束,因为当使用.OnDelete(DeleteBehavior.Cascade)配置关系时,该行为只考虑跟踪的依赖实体,而untracked则应该由级联删除外键神奇地处理。请参阅本文并注意以下评论:IMO,让ORM对数据库结构和约束施加某些期望是一个非常短视的设计决策。它不会“在数据库中”,而是在EF Core中的实体定义中。它肯定会在数据库中。同样,根据文档:
Shadow属性在数据库中存在不应在映射的实体类型上公开的数据时非常有用。它们最常用于外键属性,其中两个实体之间的关系由数据库中的外键值表示,但关系在实体类型上使用实体类型之间的导航属性进行管理。
Shadow属性是实体框架概念,而不是数据库概念。因此,不,它们不在“数据库中”。我提到这一点只是为了让任何研究这个主题的人都清楚。实际上,如果你在我之前的评论中链接的EF核心文档中尝试这个例子,你会发现EF将在表
Posts
上创建一个列
BlogId
“在数据库中”。也许我们谈论的是另一件事,但是shadow属性在数据库中肯定会有一个对应的列。我相信“shadow属性”意味着您不会在类型本身上看到该属性。但它会出现在数据库中。今天可能会有帮助
modelBuilder.Entity<Blog>()
            .HasMany(b => b.Posts)
            .WithOne(p => p.blog);