Entity Framework表拆分

一、概念

表拆分:一个表拆分成多个实体,例如Photograph表,可以拆分为Photograph和PhotographFullImage两张表。

Photograph实体结构:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel.DataAnnotations;
 4 using System.ComponentModel.DataAnnotations.Schema;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace CodeFirstTableSplit.Model
10 {
11     /// <summary>
12     /// 缩略图类
13     /// </summary>
14     public class Photograph
15     {
16         /// <summary>
17         /// 设置PhotoId是主键 自动增长
18         /// </summary>
19         [Key]
20         [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
21         public int PhotoId { get; set; }
22
23         public string Title { get; set; }
24
25         /// <summary>
26         /// 缩略图
27         /// </summary>
28         public byte[] ThumbnailBite { get; set; }
29
30         /// <summary>
31         /// Photograph通过导航属性引用PhotographFullImage
32         /// </summary>
33         [ForeignKey("PhotoId")]
34         public virtual PhotographFullImage PhotographFullImage { get; set; }
35     }
36 }

2、PhotographFullImage实体结构:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel.DataAnnotations;
 4 using System.ComponentModel.DataAnnotations.Schema;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace CodeFirstTableSplit.Model
10 {
11     public class PhotographFullImage
12     {
13         [Key]
14         public int PhotoId { get; set; }
15
16         /// <summary>
17         /// 高分辨率
18         /// </summary>
19         public byte[] HighResolutionBits { get; set; }
20
21         /// <summary>
22         /// PhotographFullImage通过导航属性引用Photograph
23         /// </summary>
24         [ForeignKey("PhotoId")]
25         public virtual Photograph Photograph { get; set; }
26     }
27 }

3、创建数据上下文对象子类:

 1 using CodeFirstTableSplit.Model;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Data.Entity;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace CodeFirstTableSplit.DatabaseContext
10 {
11     public class EFDbContext :DbContext
12     {
13         public EFDbContext()
14             : base("name=Default")
15         { }
16
17         public DbSet<Photograph> Photographs { get; set; }
18
19         public DbSet<PhotographFullImage> PhotographFullImages { get; set; }
20
21         protected override void OnModelCreating(DbModelBuilder modelBuilder)
22         {
23             // 设置主体
24             modelBuilder.Entity<Photograph>().HasRequired(p => p.PhotographFullImage).WithRequiredPrincipal(t => t.Photograph);
25
26             // 生成同一张表:设置两个实体有相同的表名
27             modelBuilder.Entity<Photograph>().ToTable("Photograph");
28             modelBuilder.Entity<PhotographFullImage>().ToTable("Photograph");
29             base.OnModelCreating(modelBuilder);
30         }
31
32
33     }
34 }

4、使用数据迁移生成数据库结构,查看生成后的结构:

5、写入数据

 1 using CodeFirstTableSplit.DatabaseContext;
 2 using CodeFirstTableSplit.Model;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace CodeFirstTableSplit
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             using (var context = new EFDbContext())
16             {
17                 // 写入数据
18                 byte[] thumbBits = new byte[100];
19                 byte[] fullBits = new byte[2000];
20                 var photo = new Photograph() { Title = "李四", ThumbnailBite = thumbBits };
21                 var fullImage = new PhotographFullImage() { HighResolutionBits = fullBits };
22
23                 photo.PhotographFullImage = fullImage;
24                 context.Photographs.Add(photo);
25                 // 保存
26                 context.SaveChanges();
27             }
28             Console.WriteLine("创建成功");
29             Console.ReadKey();
30         }
31     }
32 }

6、查询数据

原文地址:https://www.cnblogs.com/dgg2015/p/11152657.html

时间: 2024-08-23 23:57:08

Entity Framework表拆分的相关文章

使用Entity Framework Core需要注意的一个全表查询问题

.NET Core 迁移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)时写了下面这样的 LINQ 查询表达式: .Where(u => u.Id == new Guid(userId)).FirstOrDefaultAsync(); 结果在 SQL Server Profiler 中发现竟然进行了全表查询. 之后将 new Guid(userId) 从表达式中移出,保存于一个局部变量中,使用这个局部变量进行查询,全表查询问题就解决了. var use

让Entity Framework启动不再效验__MigrationHistory表

Entity Framework中DbContext首次加载OnModelCreating会检查__MigrationHistory表,作为使用Code Frist编程模式,而实际先有数据库时,这种检测就是多余的了,所以需要屏蔽,在EF 4.1之前可以使用在OnModelCreating函数总加入下面语句来屏蔽这种检测: modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 而到4.3之后需要使用,上列语句以被MSDN明确表

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

在Entity Framework 中实现继承关系映射到数据库表

继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分列(Disciriminator column)(通常内容为子类的类型名)来区分哪一行表示什么类型的数据. 第二种:TPT(Table-per-type) 每种类型都有一张表(父类及每个子类都有表) 父类.各子类各自都有一张表.父类的表中只有共同的数据,子类表中有子类特定的属性.TPT很像类的继承结

Entity Framework 6.x 学习之 - 创建带连接表的实体模型 with Database First

1. 创建数据库表 CREATE TABLE [Album] ( [AlbumId] [int] NOT NULL IDENTITY(1, 1), [AlbumName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON [PRIMARY] GO ALTER TABLE [Album] ADD CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED ([AlbumId]) ON [PRIMARY] GO

Entity Framework多表多条件动态查询

方式一  Linq To Entity形式: /// <summary> /// 查询的数据 /// </summary> /// <param name="order">升序asc(默认)还是降序desc</param> /// <param name="sort">排序字段</param> /// <param name="search">查询条件</p

mvc+entity framework database first,生成的model每次更新一个表会更新所有的model

在使用Entity Framework 的Database frist或model first时,直接加attribute到modle类上是太现实也不合理的,因为model类是自动生成的,重新生成后会覆盖自己的修改.一个比较合理 做法,就是用 partial class的方式来实现. 比如有一个Model类: Movie.那我们就可以添加一个局部类文件,局部类的内容如下: using System.ComponentModel.DataAnnotations; namespace Movies.

《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! 我学习EF的原因主要是: a.EF是微软推荐的数据库访问技术: b.能提高我的开发效率,我不喜欢写那密密麻麻的SQL: c.比我写的SQL更合理,更快.目前EF生成的SQL的质量已经很高了.你比较熟悉SQL的话,那它在速度上肯定比不上你,新手的话就别跟我争快慢了,能写一像样的SQL就不错了.至少我

《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述 (转)

微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF版本更新太快,没人愿意去花时间翻译国外关于EF的书籍.使用Entity Framework开发已经有3年多了,但用得很肤浅,最近想深入学习,只好找来英文书<Entity Framework 6 Recipes>第二版,慢慢啃.首先需要说明的是,我英文不好,只是为了学习EF.把学习的过程写成博客,一