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

首现关系映射为这样的:

    /// <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. Vue生命周期函数详解

    vue实例的生命周期 1 什么是生命周期(每个实例的一辈子) 概念:每一个Vue实例创建.运行.销毁的过程,就是生命周期:在实例的生命周期中,总是伴随着各种事件,这些事件就是生命周期函数: 生命周期: ...

  2. 洛谷 P1098 字符串的展开

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数 ...

  3. mui 拨打电话

    function callPhone() { let btnArray = ['拨打', '取消']; let Phone = "10086"; mui.confirm('是否拨打 ...

  4. HDFS(一)

    HDFS的概念 HDFS首先是文件系统(FileSystem,FS),尽管这个FS是基于OS原生的文件系统之上:而且这个文件系统是一个抽象概念,HDFS作为一个整体出现,对外(client)隐藏了其内 ...

  5. Linux GNU C

    Linux 系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU C对标准C 进行一系列扩展,以增强标准C的功能. 1.零长度数组GNU C 允 ...

  6. C# 6.0 新特性收集

    先来看一段Json.Net的代码 public JObject ToJson() { var result = new JObject(); result["X"] = X; re ...

  7. net start mongodb发生系统错误2 系统找不到指定的文件

    安装mongodb时, 将mongodb 作为系统服务启动 net start mongodb,报错发生系统错误2 系统找不到指定的文件 . 查找原因是因为,系统服务的可执行文件地址有误. 修改服务地 ...

  8. Excel不同工作簿之间提取信息

    Sub 不同工作簿间提取信息() '用于单个字段信息的提取: Dim w As Workbook, wb1 As Workbook, wb2 As Workbook, wb3 As Workbook ...

  9. Java将对象写入文件读出——序列化与反序列化

    Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的. 写入: File aFile=new File("e:\\c.txt&q ...

  10. Warning: require(D:\wamp\www\glink-smart\bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in D:\wamp\www\glink-smart\bootstrap\autoload.php on line 1

    Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire ...