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】 一对多、多对多的多重关系配置

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

  • 相关阅读:
    ELK
    alerta 集中化告警信息 -zabbix
    Python安装第三方模块出错 No module named setuptools
    Centos7 搭建bind9.9
    DNS 处理模块 dnspython
    varnish 项目实战
    中文版Postman测试需要登陆才能访问的接口(基于Cookie)
    fireFox模拟 post请求、上传插件,火狐浏览器中文postman插件
    MySQL单表最大记录数不能超过多少?
    ApiPost(中文版postman)如何发送一个随机数或者时间戳?
  • 原文地址:https://www.cnblogs.com/Sunlimi/p/4348299.html
Copyright © 2011-2022 走看看