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 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...
随机推荐
- BZOJ4152 AMPPZ2014 The Captain 【最短路】【贪心】*
BZOJ4152 AMPPZ2014 The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点 ...
- BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*
BZOJ1336 Balkan2002 Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000, ...
- 20179223《Linux内核原理与分析》第七周学习笔记
视频知识学习 1.fork()函数被调用一次,但返回两次: 2.Linux通过复制父进程来创建一个子进程,通过调用fork来实现: 3.Linux会为每个子进程动态的分配一个task_struct结构 ...
- ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存
分享 最近在公司成功落地了一个用ASP.NET Core 开发前台的CMS项目,虽然对于表层的开发是兼容MVC5的,但是作为爱好者当然要用尽量多的ASP.NET Core新功能了. 背景 在项目开发的 ...
- WebLogic11g-常用运维操作
转:http://www.codeweblog.com/weblogic11g-%e5%b8%b8%e7%94%a8%e8%bf%90%e7%bb%b4%e6%93%8d%e4%bd%9c/ 希望这篇 ...
- linux 系统下配置tomcat,并给tomcat赋予最高操作权限,启动tomcat和关闭tomcat
配置tomcat服器 sudo chmod -R 777 * 给某个文件下所有文件赋予最高的读写权限 红颜色的字是路径,蓝颜色字是命令 (1)官方网站下载tomcat压缩包.apache-tomcat ...
- YARN的Fair Scheduler和Capacity Scheduler
关于Scheduler YARN有四种调度机制:Fair Schedule,Capacity Schedule,FIFO以及Priority: 其中Fair Scheduler是资源池机制,进入到里面 ...
- iOS中Cookie的管理
平常的app开发中只调用Rest Api可能用不到Cookie,但是当要在App中内嵌WebView就有可能要用到.最近用到了这一块的东西,总结一下. Cookie原理 关于cookie的原理简单描述 ...
- Java经典练习题_Day03
一.选择 B D(死循环) E(switch) BC 二.编程 1.读入一个整数,表示一个人的年龄. 如果小于6岁,则输出“儿童”, 6岁到13岁,输出“少儿”; 14岁到18岁, ...
- python中scipy学习——随机稀疏矩阵及操作
1.生成随机稀疏矩阵: scipy中生成随机稀疏矩阵的函数如下: scipy.sparse.rand(m,n,density,format,dtype,random_state) 1 参数介绍: 参数 ...