EF多实体对应单表

1、EF多实体对应单表

适用场景:单数据库表,表数据有较长用字段,有不常用或者大数据字段。

2、建表语句  

CREATE TABLE [Chapter2].[Photograph](
    [PhotoId] [int] IDENTITY(1,1) primary key NOT NULL,
    [Title] [varchar](50) NOT NULL,
    [ThumbnailBits] [image] NOT NULL,
    [HighResolutionBits] [image] NOT NULL
    )

3、新建控制程序,添加EntityFramework 引用。

4、创建两个实体实体,实体由同一个表不同字段组成。

public class PictureContext : DbContext
    {
        public DbSet<Photograph> Photographs { get; set; }
        public DbSet<PhotographFullImage> PhotographFullImage { get; set; }

        public PictureContext() : base("EFRecipesEntities")
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Photograph>()
                .HasRequired(p => p.PhotographFullImage)
                .WithRequiredPrincipal(p => p.Photograph);

            modelBuilder.Entity<Photograph>().ToTable("Photograph", "Chapter2");
            modelBuilder.Entity<PhotographFullImage>().ToTable("Photograph", "Chapter2");
        }
    }

    public class Photograph
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PhotoId { get; set; }
        public string Title { get; set; }
        public byte[] ThumbnailBits { get; set; }
        [ForeignKey("PhotoId")]
        public virtual PhotographFullImage PhotographFullImage { get; set; }
    }

    public class PhotographFullImage
    {
        [Key]
        public int PhotoId { get; set; }
        public byte[] HighResolutionBits { get; set; }
        [ForeignKey("PhotoId")]
        public virtual Photograph Photograph { get; set; }
    }

注意图中指定Photograph实体需要(HasRequired) PhotographFullImage实体,并通过WithRequiredPrincipal,指定主键由Photograph负责。

5、修改Main程序如下:

  

 static void Main(string[] args)
        {
            byte[] thumbBits = new byte[100];
            byte[] fullBits = new byte[2000];
            using (var context = new PictureContext())
            {
                var photo = new Photograph
                {
                    Title = "My Dog",
                    ThumbnailBits = thumbBits
                };
                var fullImage = new PhotographFullImage { HighResolutionBits = fullBits };
                photo.PhotographFullImage = fullImage;
                context.Photographs.Add(photo);
                context.SaveChanges();
            }
            using (var context = new PictureContext())
            {
                foreach (var photo in context.Photographs)
                {
                    Console.WriteLine("Photo: {0}, ThumbnailSize {1} bytes",
                        photo.Title, photo.ThumbnailBits.Length);
                    // explicitly load the "expensive" entity,
                    context.Entry(photo).Reference(p => p.PhotographFullImage).Load();
                    Console.WriteLine("Full Image Size: {0} bytes",
                        photo.PhotographFullImage.HighResolutionBits.Length);
                }
            }

            Console.ReadKey();
        }

原文地址:https://www.cnblogs.com/bro-ma/p/10703890.html

时间: 2024-10-21 22:01:28

EF多实体对应单表的相关文章

持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass

通过以前的文章,我们了解到@Table.@Column.@Id实现了单表的映射,并且书剑有一个@Id指定的唯一字段.有时我们的数据表也许是有多个主键联合组成的,因此对于单表映射的主键,还可以进行如下两种联合主键映射. 联合主键:使用@IdClass指定外部主键 联合主键:使用@EmbeddedId嵌入外部主键 下面通过实例来看这两种主键的开发方法. Demo:设计一个家庭表Family的数据结构 ==================================================

持久化API(JPA)系列(八)实体关系映射(ORM)之单表映射@EmbeddedId

接上文<持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass> 本文将介绍<联合主键:使用@EmbeddedId嵌入外部主键> 上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代. 1)新建外部主键类Family2.java 设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数. 主键类必须满足: 1.必须实现Serializable接口,

Hibernate学习笔记(一)--&gt;数据库单表操作

Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibernate框架. 一.搭建一个项目 1.首先在MyEclipse中搭建一个web项目. 2.选中项目右键-->myeclipse-->Project Facets-->找到hibernate.这样就为项目添加了hibernate支持 3.打开hibernate.cfg.xml配置文件,在可视化编

mybatis单表操作实现完全java代码封装

之前在项目中用到mybtis操作数据库时都是手动写sql,对于我这种sql水平不是很好地人来说痛苦死了:动态查询的sql我表示到现在还不会写呀! 还好,利用数据库表反向生成的工具可以帮我解决大部分的sql;(mybatis generator 你懂的) 首先利用反向生成可以帮我们自动生成实体类,dao接口,dao映射文件: 在dao映射文件如下所示: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE

hibernate单表映射

什么是Hibernate? ORM:object relationship mapping对象关系映射 hibernate是java领域的一款开源的ORM框架技术. hibernate是对jdbc进行了非常轻量级的对象封装. 1.开发工具:Eclipse Standard Kepler Hibernate Tools for eclipse Plugins Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件,该插件可以简化ORM框架Hibernate,以及JBo

SQLSERVER单表CRUD通用方法

一.适用场景 ①当你书写简单的增删改查心累了 ②当你的项目不考虑并发.高性能 ③当你追求更快速的开发效率 ④当你的业务只涉及单表 二.代码展示 ①单表Insert 1 public bool Insert<T>(T t) 2 { 3 var o = t.GetType(); 4 var sBulider = new StringBuilder("insert into "); 5 sBulider.Append("[" + o.Name + "

《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体

2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuct 和ProductWebInfo,拥有共同的主键 按下面的步骤为这两张表建模一个单独实体: 1.在你的项目中,创建一个继承至DbContext的上下文对象EF6RecipesContext: 2.使用代码清单2-8创建一个POCO实体Product: 代码清单2-8:创建一个POCO实体Produ

单表ORM框架

基本描述 1.首先是一个单表的ORM框架,多表连接查询请使用视图或者使用SqlHelper查询,然后转换成实体集合. 2.目前仅完成基本结构和MySQL部分. 3.目前欠缺Lambda表达式解析,所以条件和排序部分比较粗糙. 4.后期对整个项目构架可能会调整. 获取代码 ……不会GIT搞了半天没传上去 ,我弄个SVN 弄好了贴地址上来. 参与开发 请加入QQ群:59303472

MySql单表最大8000W+ 之数据库遇瓶颈记

前言 昨晚救火到两三点,早上七点多醒来,朦胧中醒来发现电脑还开着,赶紧爬起来看昨晚执行的SQL命令结果.由于昨晚升级了阿里云的RDS,等了将近两个小时 还在 升降级中,早上阿里云那边回复升级过程中出现异常,正在加紧处理...有点蛋疼 项目介绍 这个项目主要分为WEB.WEB-Manager.WEB-API.APP(ANDROID.IOS) . 开发语言主要是ASP.NET 数据库MySql 架构采用了ASP.NET +EF+ORM   Unity依赖注入 采用了DDD的部分实践 ORM使用的是A