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里一对一、一对多、多对多关系的配置的更多相关文章

  1. SQLAlchemy_定义(一对一/一对多/多对多)关系

    目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...

  2. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  3. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  6. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

  7. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  8. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  9. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

随机推荐

  1. MySQL5.6 GTID、多线程复制

    MySQL5.6新特性GTID.多线程复制 在Oracle发布MySQL5.6看到众多新特性之后很兴奋,包括对复制的改进.在MySQL5.5半同步复制之后MySQL5.6又引入GTID.多线程复制,在 ...

  2. 在 Xcode 7 中安装 Alcatraz

    http://www.jianshu.com/p/5c8ed25ad434 安装Xcode7后,继续采用官方方法安装Alcatraz,发现不成功.单独安装XVim也不成功.看了一下Alcatraz的i ...

  3. wordpress 获取特色图片url方法

    制作主题是需要获取特色图片,直接获取到url能更好的编辑css样式 <?php $large_image_url = wp_get_attachment_image_src( get_post_ ...

  4. php截取utf-8中文字符串乱码的解决方法

    /** * PHP截取UTF-8字符串,解决半字符问题. * 英文.数字(半角)为1字节(8位),中文(全角)为2字节 * @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串 ...

  5. imx6 gpio irq

    /***************************************************************** * gpio irq * * 一直以来都没了解过gpio的irq, ...

  6. stella mccartney falabella foldover tote a few eye observed

    Lately, the particular Heyuan City Courtroom retrial, in order to commit the criminal offense of cou ...

  7. Glide 小知识点

  8. scala学习----柯里化

    1.鸭子类型,走起来像鸭子,叫起来像鸭子,就是鸭子.函数中使用{ def close(): Unit }作为参数类型,因此任何含有此函数的类都可以作为参数传递.好处是不必使用继承特性. def wit ...

  9. C#3.0 扩展方法

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  10. goldengate studio 12.2.1.2.6发布

    主要特性: 1. 支持bigdata & teradata为目标端: