EF里一对一、一对多、多对多关系的配置
EF关系规则

参考文章:http://www.cnblogs.com/feigao/p/4617442.html
Entity Framework 实体间的关系,一对一,一对多,多对多,根据方向性来说又分为双向和单向。Code First在实体关系上有以下约定
1. 两个实体,如果一个实体包含一个引用属性,另一个实体包含一个集合属性,Code First默认约定它们为一对多关系。
2. 两个实体,如果只有一个实体包含一个导航属性或一个集合属性,Code First也默认约定它们是一对多关系。
3. 两个实体分别包含一个集合属性,Code First默认约定它们为多对多关系。
4. 两个实体分别包含一个引用属性,Code First默认约定它们为一对一关系。
5. 在一对一关系情况下,需要提供给Code First额外的信息,以确定它们的主从关系。
6. 在实体中定义一个外键属性,Code First使用属性是否为空来确定关系是必须还是可选
一对一:
以产品和保修卡为例,一个产品对应一个保修卡,产品和保修卡使用相同的产品编号
产品类
public class Product
{
public int Id { get; set; }
/// <summary>
/// 产品名字
/// </summary>
public string Name { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 保修卡
/// </summary>
public virtual WarrantyCard WarrantyCard { get; set; }
}
保修卡类:
public class WarrantyCard
{
public int ProductId { get; set; }
public DateTime ExpiredDate { get; set; }
public virtual Product Product { get; set; }
}
public class WarrantyCardMap : EntityTypeConfiguration<WarrantyCard>, IEntityMapper
{
public WarrantyCardMap()
{
ToTable("WarrantyCard");
HasKey(i => i.ProductId);
}
public void RegistTo(System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar configurations)
{
configurations.Add(this);
}
}
public class ProductMap : EntityTypeConfiguration<Product>, IEntityMapper
{
public ProductMap()
{
ToTable("Product");
HasKey(p => p.Id);
HasRequired(p => p.WarrantyCard).WithRequiredPrincipal(i => i.Product);
HasOptional(p => p.WarrantyCard).WithRequired(i => i.Product);
}
}
Product作为Principal(主)而WarrantyCard作为Dependent
一对一(可空):
以产品和发票为例,有些产品可能没有发票
发票类:
public class Invoice
{
public int Id { get; set; }
public string InvoiceNo { get; set; }
public DateTime CreateDate { get; set; }
}
产品类新增
public virtual Invoice Invoice { get; set; }
public int? InvoiceId { get; set; }
在ProductMap中配置
HasOptional(p => p.Invoice).WithMany().HasForeignKey(p => p.InvoiceId);
HasOptional表示可空,WithMany()中没有参数标识不需要从发票关联到产品
一对多:
以产品和照片为例:
产品照片类:
public class ProductPhoto
{
public int Id { get; set; }
public string FileName { get; set; }
public float FileSize { get; set; }
public virtual Product Product { get; set; }
public int ProductId { get; set; }
}
Product类增加ProductPhoto集合:
public virtual ICollection<ProductPhoto> Photos { get; set; }
ProductMap中配置
HasMany(p => p.Photos).WithRequired(pp => pp.Product).HasForeignKey(pp => pp.ProductId);
public class ProductPhotoMap : EntityTypeConfiguration<ProductPhoto>,IEntityMapper
{
public ProductPhotoMap()
{
ToTable("ProductPhoto");
HasKey(pp => pp.Id); }
public void RegistTo(System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar configurations)
{
configurations.Add(this);
}
}
HasMany表示Product中有多个ProductPhoto,WithRequired表示ProductPhoto一定会关联到一个Product
多对多:
产品和产品标签,一个产品可以有多个标签,一个标签也可对应多个产品
标签类:
public class Tag
{
public int Id { get; set; } public string Text { get; set; } public virtual ICollection<Product> Products { get; set; }
}
Product增加标签集合
/// <summary>
/// 标签
/// </summary>
public virtual ICollection<Tag> Tags { get; set; }
ProductMap中添加配置:
HasMany(p => p.Tags).WithMany(t => t.Products).Map(m => m.ToTable("Product_Tag_Mapping"));
public class TagMap : EntityTypeConfiguration<Tag>,IEntityMapper
{
public TagMap()
{
ToTable("Tag"); HasKey(t => t.Id);
}
public void RegistTo(System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar configurations)
{
configurations.Add(this);
}
}
EF里一对一、一对多、多对多关系的配置的更多相关文章
- SQLAlchemy_定义(一对一/一对多/多对多)关系
目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- EF——一对一、一对多、多对多关系的配置和级联删除 04(转)
EF里一对一.一对多.多对多关系的配置和级联删除 本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
随机推荐
- Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试
Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...
- 根据序列图像聚焦区域获取深度 Shape From Focus
最为超新新新新鸟...我也不知道第一篇文章应该写什么..所以,把自己最近正在研究的东西报一下吧, 研究的东西其实也不算深奥,就是对一个图像序列中的每张图像进行检测,发现每张图片的聚焦清晰区域,找到这个 ...
- 关于opacity的兼容问题
各个浏览器的解决办法: css: .opacity{ filter:alpha(opacity=50); /* IE */ -moz-opacity:0.5; /* 老版Mozilla */ -kht ...
- Bootstrap<基础十> 响应式实用工具
Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎使用这些工具,避免在同一个站点创建完全不同 ...
- ES6中块作用域之于for语句是怎样的?
在ES6中新加了快作用域的概念(C语言就有,作为类c语言的js,当然应该加上),算是很好理解. { let i; } console.log(i);// i is not defined 在代码块当中 ...
- PDA项目介绍
开发工具:Microsoft Visual Studio 2008 SDK: Windows Mobile 6 SDK 数据库: Oracle 开发语言:C#(3.5) 版本控制工具 ...
- Apriori on MapReduce
Apiroi算法在Hadoop MapReduce上的实现 输入格式: 一行为一个Bucket 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 34 36 38 ...
- 前端:IE兼容性的相关方法
有一段时间做前端的时候,IE下的就兼容性是比较令人头痛的问题,我在这一过程中也是看了很多的资料,然后把一些自己觉得比较普遍的问题进行一下相关的总结. 1.在IE6下,格式为png的图片在IE6上的透明 ...
- React之Composition Vs inheritance 组合Vs继承
React的组合 composition: props有个特殊属性,children,组件可以通过props.children拿到所有包含在内的子元素, 当组件内有子元素时,组件属性上的child ...
- Unity3D之C# yield waitforseconds
Wait for seconds requires a couple things in order to work properly and chances are if it's not work ...