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);
}
首先我们表明,我们数据库中这个三个字段都是主键,接着我们定义映射关系。
EF中关系映射问题的更多相关文章
- XML映射文件中关系映射
映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工表: DROP ...
- EF继承关系映射
继承映射策略的三种策略 There are following three different approaches to represent an inheritance hierarchy in ...
- hibernate中关系映射的配置问题
部门和员工属于一对多的关系 员工的账户属于一对一关系 账户和权限属于多对多关系 department.hbm.xml 1 <hibernate-mapping> 2 <class n ...
- hibernate(3) —— 关系映射
hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...
- python第三篇:python、flask关系映射
python中关系映射主要包括三种:一对多关系映射.一对一关系映射.多对多关系映射. 一对多关系映射 一方:Student(学生) 添加关联属性和反向引用 多方:Article(文章) 添加外键关联 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?
前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...
- 《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射
转载于:http://blog.csdn.net/zhoukun1008/article/details/50528145 现在越来越喜欢MVC了,不光是因为ITOO中用到了他,而是因为它里面包含了很 ...
- EF中如何为表添加新的字段和映射
首先先了解一下ef生成的模型edmx的代码,传送门:http://www.cnblogs.com/yushengbo/p/4807715.html 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...
随机推荐
- BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*
BZOJ3141 Hnoi2013 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点 ...
- __weak、__strong这样的关键词和weak、strong有哪些区别
ios4 设备上最好就不要使用 ARC... strong,weak 用来修饰属性.strong 用来修饰强引用的属性:@property (strong) SomeClass * aObject; ...
- FirstTry_HelloWorld
#include <qapplication.h> #include <qpushbutton.h> int main( int argc, char **argv ) { Q ...
- python 判断类型
转自:http://san-yun.iteye.com/blog/1543174 Python可以得到一个对象的类型 ,利用type函数: >>>lst = [1, 2, 3] &g ...
- Hbase 之 HBase 的整体架构
HBase 系统架构图 组成部件说明 Client: 使用HBase RPC机制与HMaster和HRegionServer进行通信 Client与HMaster进行通信进行管理类操作 Cli ...
- tomcat深入学习
总体结构:https://www.jianshu.com/p/d74eef07487f servlet相关:https://www.ibm.com/developerworks/cn/java/j-l ...
- PyBrain库的example之NFQ流程图分析
PyBrain库的example之NFQ流程图分析 如下是测试程序.主要分析doEpisode和learn两个函数. #!/usr/bin/env python __author__ = 'Thoma ...
- 嵌入式linux问题杂锦
tftp 在开发板上不能获取共享文件,出现: Permission denied tftp: can't open 'myTcpTest': Permission denied 是因为,我在/sys目 ...
- CentOS6.5安装中文支持
本人在安装CentOS6.5时选择是英文版,安装后打开文档,发现好些文档成了乱码了. 这个问题的原因是没有中文支持. 解决方法: 1.安装中文支持包 # yum groupinstall " ...
- STL容器——对map排序
STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入 ...