EF多实体对应单表

Posted bro-ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
    )
View Code

 

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; }
    }
View Code

 注意图中指定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();
        }
View Code

 

以上是关于EF多实体对应单表的主要内容,如果未能解决你的问题,请参考以下文章

EF 开始的片段时有问题 具有潜在运行时冲突

EF6基础系列(五)---EF中的实体关系

EF添加关联的提示问题:映射从第 260 行开始的片段时有问题:

EF之Model First

EF更新多对多关系表中记录的时候,无法更新关系表的问题。

EF 4.1 复杂关系的实体映射