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 ...
随机推荐
- Java期末设计(十三周)
一.项目完成计划 十三周和十四周完成用户交互界面的设计(1.登陆界面2.订票以及查询界面3.用户管理界面4.退票界面): 十三周完成登陆界面,十四周完成订票以及查询界面,用户管理界面和 ...
- JavaScript 字符串常用操作
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- 获取数据库表详细信息、存储过程、视图、的sql
select s.[name] + '.' + t.[name] as tablename from sys.tables as t,sys.schemas as s where t.schema_i ...
- redis-JedisPoolConfig配置
项目之前要使用redis这个临时缓存,下面是从别的大神那里转来的一些基本配置属性的说明: JedisPoolConfig config = new JedisPoolConfig(); //连接耗 ...
- tensor flow入门笔记
个人学习笔记,欢迎交流.
- 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- js图片放大效果
实现购物网站里的图片放大效果,jqzoom很好用.今天才接触它,很快就上手了.看了一个示例,在放大图像上方貌似有水印,后经排查,原来是图片的标题,然后设置title为false,搞定.
- 张小龙微信小程序演讲内容简介
1月9号,看看实际上如何
- Ubuntu下freeradius的EAP-MD5,PEAPv0/EAP-MSCHAPv2,EAP-TTLS/MD5,EAP-TTLS/MSCHAPv2方式认证(基于mysql)
基于freeradius+mysql,今天验证下freeradius的EAP认证:1.EAP-MD5:2.EAP-PEAP 一.EAP-MD5方式认证 1.修改配置文件 (1)/usr/local/e ...
- js③
while(true){ console.log('hello'); }/每次执行完语句块之后,又会跳回去检查小括号里面的布尔值,如果为true,那么又会执行语句块一次. //while循环//var ...