• EF中关系映射问题


    一对一,和一对多的简单问题就部说了,直接来多对多这样的问题吧。

    首现关系映射为这样的:

        /// <summary>
        /// 对应数据库中dbo.Address表
        /// </summary>
        [DataContract]
        [Table("Address", Schema = "dbo")]
        public class AddressInfo
        {
            public AddressInfo()
            {
                Province = new HashSet<ApplyAddress>();
                City = new HashSet<ApplyAddress>();
            }
            [DataMember]
            [Key]
            public int AddressId { get; set; }
                #region Relations
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<ApplyAddress> Province { get; set; }
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<ApplyAddress> City { get; set; }
            #endregion
        }
    

      

        /// <summary>
        /// 对应数据库中Apply.Address表
        /// </summary>
        [Table("Address", Schema = "Apply")]
        public class ApplyAddress : IEntity
        {
            [Key, Column(Order = 0)]
            [ForeignKey("Apply")]
            public int ApplyId { get; set; }
            [Key, Column(Order = 1)]
            [ForeignKey("Province")]
            public int ProvinceId { get; set; }
            [Key, Column(Order = 2)]
            [ForeignKey("City")]    
            public int CityId { get; set; }
            #region Relations
            public virtual ApplyInfo Apply { get; set; }
            public virtual AddressInfo Province { get; set; }
            public virtual AddressInfo City { get; set; }
            #endregion
    
        }
    

      

         /// <summary>
        /// 对应数据库中 dbo.UserApply表
        /// </summary> 
       [Table("UserApply", Schema = "dbo")]
        public class ApplyInfo : IEntity
        {
            public ApplyInfo()
            {
                Addresses = new HashSet<ApplyAddress>();
            }
            [Key]
            public int ApplyId { get; set; }
    
            public System.Guid UserId { get; set; }
           #region Relations
            [NotMapped]
            public virtual JobPositionCategory Category { get; set; }
            [NotMapped]
            public virtual ICollection<ApplyAddress> Addresses { get; set; }
            #endregion
        }
    

      这打致就是这三个表的结构的定义,dbo.address 的主键AddressID 和dbo.UserApply 的主键ApplyId 分别构成了Apply.Address 的三个主键(AddressId对应键ProvinceID和Cityid,Applyid对应键applyInfo),说明一下:我的AddressId 在数据库中表示的是省份和市都在一张表中表示,用的一个ParentId字段进行表示的,所以我这里的一个字段对应两个主键。

    这个写逻辑上没有问题,可是Ef并不能帮我们识别,我们需要重写继承自DbCoontext的类中进行方法的重写,我们自己进行数据的定义

           protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<ApplyAddress>().HasKey(t => new { t.ApplyId, t.CityId, t.ProvinceId });
                modelBuilder.Entity<ApplyAddress>()
                    .HasOne(address => address.Apply)
                    .WithMany(a => a.Addresses)
                    .HasForeignKey(a => a.ApplyId);
                modelBuilder.Entity<ApplyAddress>()
                    .HasOne(address => address.Province)
                    .WithMany(a => a.Province)
                    .HasForeignKey(a => a.ProvinceId);
                modelBuilder.Entity<ApplyAddress>()
                    .HasOne(address => address.City)
                    .WithMany(a => a.City)
                    .HasForeignKey(a => a.CityId);
                base.OnModelCreating(modelBuilder);
            }
    

      首先我们表明,我们数据库中这个三个字段都是主键,接着我们定义映射关系。

  • 相关阅读:
    线性筛素数
    m个苹果放入n个盘子问题
    幸运的袋子
    [HNOI2013]消毒
    [SDOI2016]数字配对
    [SCOI2015]小凸玩矩阵
    [JLOI2008]将军
    [HEOI2016/TJOI2016]游戏
    [洛谷4329/COCI2006-2007#1] Bond
    [BZOJ1324]Exca王者之剑
  • 原文地址:https://www.cnblogs.com/qulianqing/p/7105250.html
Copyright © 2020-2023  润新知