一对一,和一对多的简单问题就部说了,直接来多对多这样的问题吧。
首现关系映射为这样的:
/// <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);
}
首先我们表明,我们数据库中这个三个字段都是主键,接着我们定义映射关系。