Entity Framework 关系约束配置

原文:Entity Framework 关系约束配置

前言

简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在设计表的时候预先设计好的,通过主外键进行关联。那么现在在Entity Framework中是如何配置处理的呢?

Entity Framework 关系约束配置

 对于实体关系对应的数据表关系,无非“0:1,1:1,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表示,N端使用ICollection集合类型表示。对于单实体端,默认是可为空的,即为0关系,如果要设置为1关系,要使用[Required]标签来进行标记。但对于一对一中的关系主体与依赖对象确无法做更细节的控制。

下面来依依看一下这几种数据表的关系

第一种:0:1。举例说明:有一个数据表Emplyee代表该公司的员工表,而该公司里的员工有一个通讯账号数据库表MessagingAccount,而有些员工不使用,也就是没有通讯账号。这就说明员工Employee和MessagingAccount之间的关系就是一个员工对应一个通讯账号,或者一个员工没有通讯账号。

WithOptional:将关系配置为required:optional。(required:0…1端的1,表示必需,不可为null;optional:0…1端的0,表示可选,可为null。下同)

modelBuilder.Entity<MessagingAccount>().HasRequired(m => m.Employee).WithOptional(n=>n.Acount);

配置一对〇关系,允许存在一个Employee而不存在MessagingAcount的情况(注意在Employee中添加Accout属性) 

第二种:1:1.举例说明:还是第一种的例子中每个员工都有一个通讯账号的话。

WithRequiredDependent:将关系配置为required:required。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。

modelBuilder.Entity<Employee>().HasRequired(emp => emp.Acount).WithRequiredPrincipal(a => a.Employee);

 第三种:1:N。举例说明:订单和谁下的订单。通常的关系都是一个订单只会由一个人来下,反过来也就是说一个人可能有多个订单。也就是一个Customer可以有多个Order.是一个一对多的关系。

modelBuilder.Entity<Order>().HasRequired(o=>o.Customer).WithMany();

第四种:N:N。举例说明:订单和产品之间的关系。一个Order订单可能会有多个产品Product的可能。同理,一个产品Product也会存在与多个订单Order当中。

            modelBuilder.Entity<Order>().HasMany(o => o.Products).WithMany(p => p.Orders).Map(m =>
            {
                m.ToTable("OrderDetails");
                m.MapLeftKey("OrderID");
                m.MapRightKey("ProductID");
            });

配置多对多的关系,并指定了表名、对应的外键;注意如果不使用FluentAPI配置,Product和Order配置了相应的导航属性,EF也会默认生成一张表(表名为“<数据类1>+<数据类2>”)

Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。

特殊的一种:组合主键的使用。

  //组合主键 modelBuilder.Entity<Order>().HasRequired(o => o.Customer).WithMany().HasForeignKey(o => new { o.CustomerNo,o.CustomerName});

 复杂类型的使用。

modelBuilder.ComplexType<Name>().Property(m => m.FirstName).HasMaxLength(40);

 

时间: 2024-09-20 13:36:04

Entity Framework 关系约束配置的相关文章

Entity Framework 系统约定配置

原文:Entity Framework 系统约定配置 前言 Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来越复杂,大家都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.

Entity Framework 5.0基础系列

原文:Entity Framework 5.0基础系列 1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http://www.cnblogs.com/aehyok/p/3318892.html 3.Entity Framework ModelFirst尝试http://www.cnblogs.com/aehyok/p/3323438.html 4.Entit

Entity Framework 5.0系列之约定配置

Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.在EF中是以一种约定的方式进行表.列同实体类进行映射的,与此

Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)

在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式是通过在实体类(POCO类)里面添加相应的特性说明来实现的,但是有时候我们可能需要考虑基于多种数据库的方式,那这种方式可能就不合适.本篇主要介绍使用 Fluent API 配置实现Code First模式的实体框架构造方式. 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 P

在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?

在<实现存储过程的自动映射>中,我通过基于T4的代码生成实现了CUD存储过程的自动映射.由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景.如果两种模型存在差异,在进行数据更新操作的时候就会出错.本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程. 目录 一.创建具有继承关系的实体 二.基于继承关系实体的查询与更新 三.映射标准的CUD存储过程 四.修正存储过程 一.创建具有继承关系的实体 假设数据库中有如下两个

Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many

通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?"血"的教训啊,刚开始使用 Entity Framework 的时候,由于没有静下心来认真理清关系,走了一些"痛不欲生"的弯路.而我们目前开发的项目都在使用 Entity Framework,为了避免其他人再经历"痛不欲生"的弯路.于是下定决心边"理清关系"边"写博客".

Entity Framework快速入门--一对零到一关系处理

很久不更新blog了,正好趁着端午节的空,把之前一段时间使用关于EF以及工作上经验总结一下. 此文将跟朋友们分享一下关于1对0..1实体模型一些使用包括基本的添加和查询的注意事项. 首先我们EDMX实体模型: 模型很简单,一个用户的实体,另外关联了一个用户信息的实体.有些情况下我们会有这样的需求,用户登录身份验证,而每次再查询用户信息的时候,往往会去查询用户表,而这时候我们仅仅使用了2-3个字段也就是用户账号跟密码是否一致,如果一致就返回true,否则返回false,而我们往往在用户表上挂在很多

Entity Framework 5.0系列之EF概览

概述 在开发面向数据的软件时我们常常为了解决业务问题实体.关系和逻辑构建模型而费尽心机,ORM的产生为我们提供了一种优雅的解决方案.ADO.NET Entity Framework是.NET开发中一种由ADO.NET驱动的ORM框架,使用Entity Framework开发人员可以不必考虑数据的基础数据表和列,在处理数据时能够以更高的抽象级别进行工作,并能够以相对传统开发编写更少的代码来创建和维护应用程序. 我们知道面向对象的编程与数据存储系统的交换提出了一个难题:类结构通常同关系数据表组织结构

学习Entity Framework 中的Code First

这是上周就写好的文章是在公司浩哥的建议下写的本来是部门里面分享求创新用的这里贴出来分享给大家.   最近在对MVC的学习过程中接触到了Code First这种新的设计模式感觉很新颖并且也体验到了这种方式所带来的便利.这里将我的一些理解分享出来. 需要了解的概念 POCO POCOPlain Old CLR Object的概念是从java的POJO借用而来而两者的含义是一致的不同的仅仅是使用的语言不一样.所以POCO的解释就是"Plain Old C# Object".POJO的内在含义