zoukankan      html  css  js  c++  java
  • 【EF Code First】 一对一、一对多的多重关系配置

    这里使用相册Album和图片Picture的关系做示例

    1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片)

       这时Album、Picture实体类可以这么定义

       /// <summary>
        /// 相册
        /// </summary>
        public class Album
        {
            public int ID { get; set; }
            /// <summary>
            /// 标题
            /// </summary>
            public string Title { get; set; }
            public DateTime CreateTime { get; set; }
            /// <summary>
            /// 拥有者
            /// </summary>
            public virtual User Owner { get; set; }       
        }
    

      

    /// <summary>
        /// 图片
        /// </summary>
        public class Picture
        {
            public long ID { get; set; }
    
            public string Title { get; set; }
    
            public string Uri { get; set; }
    
            public DateTime CreateTime { get; set; }
    
            /// <summary>
            /// 所属相册
            /// </summary>
            public virtual Album Album { get; set; }
        }
    

    生成的表结构

    2,后来就要改需求了,相册要加一个封面

    于是Album与Picture的关系就加了一个1-1(一个相册只有一个封面)

    这样就需要配置一下实体关系来区分属性之间的关系

    Album和Picture类做一些修改

    /// <summary>
        /// 相册
        /// </summary>
        public class Album
        {
            public int ID { get; set; }
            /// <summary>
            /// 标题
            /// </summary>
            public string Title { get; set; }
            public DateTime CreateTime { get; set; }
            /// <summary>
            /// 拥有者
            /// </summary>
            public virtual User Owner { get; set; }
            /// <summary>
            /// 封面
            /// </summary>
            public virtual Picture Cover { get; set; }
            /// <summary>
            /// 相册下的图片列表
            /// </summary>
            public virtual ICollection<Picture> Pictures { get; set; }
        }
    

      

     /// <summary>
        /// 图片
        /// </summary>
        public class Picture
        {
            public long ID { get; set; }
    
            public string Title { get; set; }
    
            public string Uri { get; set; }
    
            public DateTime CreateTime { get; set; }
    
            /// <summary>
            /// 所属相册
            /// </summary>
            public virtual Album Album { get; set; }
        }
    

    然后添加一个映射类

     public class AlbumMap:EntityTypeConfiguration<Album>
        {
            public AlbumMap() {
                this.HasMany<Picture>(a => a.Pictures).WithRequired(p=>p.Album);
            }
        }
    

    EF上下文类中重写方法

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
           {
               modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
               modelBuilder.Configurations.Add(new AlbumMap());
           }
    

    数据库迁移时生成的代码:

     public partial class AlbumAddCover : DbMigration
        {
            public override void Up()
            {
                DropForeignKey("dbo.Picture", "Album_ID", "dbo.Album");
                DropIndex("dbo.Picture", new[] { "Album_ID" });
                AddColumn("dbo.Album", "Cover_ID", c => c.Long());
                AlterColumn("dbo.Picture", "Album_ID", c => c.Int(nullable: false));
                CreateIndex("dbo.Album", "Cover_ID");
                CreateIndex("dbo.Picture", "Album_ID");
                AddForeignKey("dbo.Album", "Cover_ID", "dbo.Picture", "ID");
                AddForeignKey("dbo.Picture", "Album_ID", "dbo.Album", "ID", cascadeDelete: true);
            }
            
            public override void Down()
            {
                DropForeignKey("dbo.Picture", "Album_ID", "dbo.Album");
                DropForeignKey("dbo.Album", "Cover_ID", "dbo.Picture");
                DropIndex("dbo.Picture", new[] { "Album_ID" });
                DropIndex("dbo.Album", new[] { "Cover_ID" });
                AlterColumn("dbo.Picture", "Album_ID", c => c.Int());
                DropColumn("dbo.Album", "Cover_ID");
                CreateIndex("dbo.Picture", "Album_ID");
                AddForeignKey("dbo.Picture", "Album_ID", "dbo.Album", "ID");
            }
        }
    

    最终表结构

     上一节:【EF Code First】 一对多、多对多的多重关系配置

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    OCP-1Z0-053-V13.02-131题
    OCP-1Z0-053-V13.02-130题
    OCP-1Z0-053-V13.02-127题
    OCP-1Z0-053-V13.02-126题
    OCP-1Z0-053-V13.02-125题
    Oracle 11g New 带调度程序的轻量作业
    Oracle 11g New 资源管理器:新增的EM 界面
    Oracle 11g New 自动维护任务以及I/O校准
    tinyxml解析内存中的字符串缓冲区
    win32--tinyxml中对XML文件中的转义字符的处理
  • 原文地址:https://www.cnblogs.com/Sunlimi/p/4348299.html
Copyright © 2011-2022 走看看