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

首现关系映射为这样的:

    /// <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);
}

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

EF中关系映射问题的更多相关文章

  1. XML映射文件中关系映射

    映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工表: DROP ...

  2. EF继承关系映射

    继承映射策略的三种策略 There are following three different approaches to represent an inheritance hierarchy in ...

  3. hibernate中关系映射的配置问题

    部门和员工属于一对多的关系 员工的账户属于一对一关系 账户和权限属于多对多关系 department.hbm.xml 1 <hibernate-mapping> 2 <class n ...

  4. hibernate(3) —— 关系映射

    hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...

  5. python第三篇:python、flask关系映射

    python中关系映射主要包括三种:一对多关系映射.一对一关系映射.多对多关系映射. 一对多关系映射 一方:Student(学生) 添加关联属性和反向引用 多方:Article(文章) 添加外键关联 ...

  6. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  7. EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?

    前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...

  8. 《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射

    转载于:http://blog.csdn.net/zhoukun1008/article/details/50528145 现在越来越喜欢MVC了,不光是因为ITOO中用到了他,而是因为它里面包含了很 ...

  9. EF中如何为表添加新的字段和映射

    首先先了解一下ef生成的模型edmx的代码,传送门:http://www.cnblogs.com/yushengbo/p/4807715.html 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...

随机推荐

  1. stm32寄存器版学习笔记09 IIC

    I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中 ...

  2. JAVA类的加载、连接与初始化

    JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...

  3. LeetCode Friend Circles

    原题链接在这里:https://leetcode.com/problems/friend-circles/description/ 题目: There are N students in a clas ...

  4. python当前路径

    os.getcwd()获取系统路径 sys.path [0]获取当前路径

  5. LG3835 【模板】可持久化平衡树

    题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名 ...

  6. vs中无法找到头文件

    在VS项目上右键属性 C/C++->常规->附加包含目录中把此路径添加上,路径与路径之间用 ; 隔开

  7. eclipse导出jar,再转换为exe可执行程序

    转自: https://blog.csdn.net/mommomm/article/details/8227876 若只想知道如何把jar转换成exe,直接看第四步即可. 一.导出jar文件: 选中你 ...

  8. 理解加密算法——创建CA机构,签发证书并开始TLS通信

    1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下,NODE.JS代码: TCP Server: const net=requir ...

  9. ubuntu 安装Eigen

    Eigen官网 Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法. ubuntu下安装: sudo apt-get install libeigen3-de ...

  10. Linut ssh sftp服务重启

    在网上,收了半天,终于找到这个,记录一下~哈~ RedHat Linux 重启SSH /etc/init.d/sshd restart 重启SFTP /etc/init.d/vsftpd restar ...