HTML5技术

EntityFramework Core映射关系详解 - Jeffcky

字号+ 作者:H5之家 来源:H5之家 2017-06-19 17:01 我要评论( )

前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始。 One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给出需要映射的两个类,一个是Blog,另外

前言

Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始。

One-Many Relationship(一对多关系)

首先我们从最简单的一对多关系说起,我们给出需要映射的两个类,一个是Blog,另外一个则是Post,如下:

public class Blog { public int Id { get; set; } public int Count { get; set; } public string Name { get; set; } public string Url { get; set; } public IEnumerable<Post> Posts { get; set; } }

public class Post { Id { get; set; } Title { get; set; } Content { get; set; } BlogId { get; set; } public virtual Blog Blog { get; set; } }

此时我们从Blog来看,一个Blog下对应多个Post,而一个Post对应只属于一个Blog,此时配置关系如下:

public class BlogMap : EntityMappingConfiguration<Blog> { Map(EntityTypeBuilder<Blog> b) { b.ToTable(); b.HasKey(k => k.Id); b.Property(p => p.Count); b.Property(p => p.Url); b.Property(p => p.Name); b.HasMany(p => p.Posts) .WithOne(p => p.Blog) .HasForeignKey(p => p.BlogId); } }

而Post则为如下:

public class PostMap : EntityMappingConfiguration<Post> { Map(EntityTypeBuilder<Post> b) { b.ToTable(); b.HasKey(k => k.Id); b.Property(p => p.Title); b.Property(p => p.Content); } }

此时我们利用SqlProfiler监控生成的SQL语句。如下:

CREATE TABLE [Blog] ( [Id] int NOT NULL IDENTITY, [Count] int NOT NULL, [Name] nvarchar(max), [Url] nvarchar(max), CONSTRAINT [PK_Blog] PRIMARY KEY ([Id]) );

CREATE TABLE [Post] ( [Id] int NOT NULL IDENTITY, [BlogId] int NOT NULL, [Content] nvarchar(max), [Title] nvarchar(max), CONSTRAINT [PK_Post] PRIMARY KEY ([Id]), CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([Id]) ON DELETE CASCADE );

此时我们能够很明确的看到对于Post表上的BlogId建立外键BlogId,也就是对应的Blog表上的主键即Id,同时后面给出了DELETE CASADE即进行级联删除的标识,也就是说当删除了Blog上的数据,那么此时Post表上对应的数据也会进行相应的删除。同时在生成SQL语句时,还对Post上的BlogId创建了索引,如下:

CREATE INDEX [IX_Post_BlogId] ON [Post] ([BlogId]);

由上知,对于一对多关系中的外键,EF Core会默认创建其索引,当然这里的索引肯定是非唯一非聚集索引,聚集索引为其主键。我们通过数据库上就可以看到,如下:

此时即使我们不配置指定外键为BlogId同样也没毛病,如下:

b.HasMany(m => m.Posts).WithOne(o => o.Blog);

因为上述我们已经明确写出了BlogId,但是EF Core依然可以为其指定BlogId为外键,现在我们反过来想,要是我们将Post中的BlogId删除,同样进行上述映射是否好使呢,经过实际验证确实是可以的,如下:

别着急下结论,我们再来看一种情况,现在我们进行如下配置并除去Post中的BlogId还是否依然好使呢?

b.HasMany(m => m.Posts);

经过临床认证,也是好使的,能够正确表达我们想要的效果并自动添加了外键BlogId列,所以到这里我们可以为一对多关系下个结论:

一对多关系结论

在一对多关系中,我们可以通过映射明确指定外键列,也可以不指定,因为EF Core内部会查找是否已经指定其外键列有则直接用指定的,没有则自动生成一个外键列,列名为外键列所在的类名+Id。同时对于一对多关系我们可以直接只使用HasMany方法来配置映射而不需要再配置HasOne或者WithOne,上述皆是从正向角度去配置映射,因为易于理解,当然反之亦然。

One-One RelationShip (一对一关系)

对于一对一关系和多对多关系稍微复杂一点,我们来各个击破,我们通过举例比如一个产品只属于一个分类,而一个分类下只有一个产品,如下:

public class Product { public int Id { get; set; } public string Name { get; set; } public Category Category { get; set; } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 在.NET Core中使用Irony实现自己的查询语言语法解析器 - dax.net

    在.NET Core中使用Irony实现自己的查询语言语法解析器 - dax.net

    2017-06-07 18:00

  • Amazing ASP.NET Core 2.0 - Savorboard

    Amazing ASP.NET Core 2.0 - Savorboard

    2017-05-25 14:00

  • Linux使用Jexus托管Asp.Net Core应用程序 - 玩双截棍的熊猫

    Linux使用Jexus托管Asp.Net Core应用程序 - 玩双截棍的熊猫

    2017-05-15 08:06

  • ASP.NET Core:部署项目到Ubuntu Server - 王杰光

    ASP.NET Core:部署项目到Ubuntu Server - 王杰光

    2017-05-07 18:01

网友点评
t