EF-CodeFirst-3搞事

本文学习旺杰兄的 CodeFirst 系列教程而写。尽量摆脱之前的影子写出自己的理解

表间关系、级联删除

简单玩法已经走通了,但是我就是想搞点事出来。今天来搞搞表间关系和级联删除

表间关系

毫无疑问在设计表的时候,对于两张有关联的表,我们要做一对一或一对多的外键关系。这样在使用EF的时候可以轻松的使用导航属性不说,也使得表结构更加简单明朗。使用CodeFirst我们该如何配置呢?

先说一对一的关系。我们这边有这样两个实体。User、UserCard。 一个用户肯定只会拥有一个身份证号、而一个身份证号肯定也只能属于一个人。这就是一个典型的一对一关系。

[Table("T_User")]
    public class User
    {
        public User()
        {
            UserId = new Guid(Guid.NewGuid().ToString("D")); ;
        }

        [Key]
        public Guid UserId { get; set; }

        [Required]
        [MaxLength(20)]
        public string Name { get; set; }

        [Timestamp]
        public byte[] RowVersion { get; set; }

        public List<UserRole.UserRole> UserRoles { get; set; }

        /// <summary>
        /// 扩展
        /// </summary>
        public UserAddress UserAddress { get; set; }

        /// <summary>
        /// 一个用户拥有一个身份证
        /// </summary>
        public UserCard UserCard { get; set; }

    }
/// <summary>
    /// 用户证件实体
    /// </summary>
    [Table("T_User_Card")]
    public class UserCard
    {
        public UserCard()
        {
            UserId = new Guid(Guid.NewGuid().ToString("D"));
        }
        [Key]
        public Guid UserId { get; set; }

        [MaxLength(18)]
        public string IdCard { get; set; }

        //一个证件只能属于一个人..一对一
        public User User { get; set; }

    }

之前也提到,配置映射有两种方式。写说注解的方式,很简单。使用ForeignKey()的方式可以轻松的搞定

[Key,ForeignKey("User")]
        public Guid UserId { get; set; }

但是在实际开发中大多会用Fluent Api 这个配置也很容易

HasRequired(u => u.User).WithOptional(u => u.UserCard);

这里记录本人不是很推荐的写法

public class UserCardMap : EntityTypeConfiguration<UserCard>
    {
        public UserCardMap()
        {
            //不推荐的写法
            HasRequired(u => u.User).WithMany().HasForeignKey(u => u.UserId);
        }
    }

首先我们搞了一个UserId做为外建,使用了Fluent Api做配置映射,下面指定了UserId为外建。看看我们数据库中的关系图是佬样的吧。下图可以看到建立了两个关系 一个UserCard中的Id为主键而User表中生成了一个UserDard_Id为外键。下面则是使用了User表中的主键 User_Card表中的UserId做为外建 。 这样看起来是双向的一对一的关系。好吧,我不需要这样的配置。复杂,而且WithMany看起来像是一对多一样

时间: 2024-10-18 05:33:24

EF-CodeFirst-3搞事的相关文章

EF CodeFirst 如何通过配置自动创建数据库&lt;当模型改变时&gt;

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧惭愧. 如有不明白,请参考:EF CodeFirst 创建数据库 及 EF CodeFirst增删改查之'CRUD' 话不多说,直接上代码: using System; using System.Collections.Generic; using System.Linq; using System

新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMapper,Ninject等技术的理解和运用,今天拿出来跟大家分享,就是想对这些技术还处在入门阶段的朋友做以参考,以及正在用这些技术做项目的朋友做一个交流和探讨. 我会在此项目的基础上去逐一讲解这些技术,简单应用就不讲了,去看项目,主要讲重点难点以及需要注意的地方,有些地方不明白的可以去下载源代码,估计

Android搞事篇——使用Intent跳转界面

跳转页面基本分为三个步骤: 1.初始化一个intent:(一个intent就够用了): 2.传入intent参数: 3.调用startactivity();实现跳转页面 具体操作如下 首先你需要一个项目或demo,然后就可以开始了 先在第一个布局里放一个Button;(别问我他是干嘛的)给他加一个id 然后创建一个新布局: 右键layout跳出来的菜单中有我这里给他的名字是second 然后新建一个second.java继承Activity在这个里面重写OnCreat()方法,然后将他跟布局绑定

EF CODEFIRST WITH ORACLE 存储过程

EF  CODEFIRST WITH ORACLE 解决存储过程一直没找到解决方案 所以最后也没办法还是用了最基本的解决方案 采用Oracle.ManagedDataAccess提供的ADO基础访问类,不需要再次额外引用第三方类库了. using Oracle.ManagedDataAccess.Client; public object[] ExecuteProc(string procName, params DbParameter[] parms) { MyDbContext dbCont

EF CodeFirst 数据库创建与迁移

一.EF CodeFirst 根据实体创建数据库 1.新建好实体类 2.添加数据库上下文的类StudentInfoEntities:继承DbContext 3.配置Web.Config连接数据库字符串(name=“数据库上下文类的名称”) 4.写个controller运行代码,自动生成数据库 二.迁移数据库(sqlserver) 当修改实体属性后需要迁移数据库:打开工具-->NuGet程序包管理器-->程序包管理器控制台 1.第一次迁移先执行命令:Enable-Migrations 2.Add

EF CodeFirst增删改查之‘CRUD’

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇旨在学习EF增删改查四大操作 上一节讲述了EF CodeFirst 创建数据库,本节继续引用上一节的相关类学习EF的CRUD操作 废话少说,直接上要点,上一节中的模型类我作了如下修改: using System; using System.Collections.Generic; using System.ComponentModel.Data

1.Relationship in Entity Framework Using Code First Approach With Fluent API【使用EF Code-First方式和Fluent API来探讨EF中的关系】

In this article, you will learn about relationships in Entity Framework using the Code First Approach with Fluent API. 在这篇文章中,你将会学习到使用EF Code-First方式和Fluent API来探讨EF中的关系(一对一,一对多,多对多). Introduction[介绍] A relationship, in the context of databases, is a

[.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性应对之道和领域驱动设计C# 2008实现等书,由于当时只是看看而已,并没有在自己代码中进行实现,只是初步了解一些DDD分层的思想和一些基本概念,例如实体,聚合根.仓储等概念,今年有机会可以去试试面试一个架构岗位的时候,深受打击,当面试官问起是否在项目中使用过DDD思想来架构项目时,我说没有,只是了解

EF codefirst 数据库迁移

如果出现 未能加载文件或程序集“Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 重新安装EF 命令Install-Package EntityFramework 在此之后 主要是3步走: 1:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbC

EF CodeFirst简介、默认约定、数据库初始化策略

CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirst默认约定 约定就是一系列的默认规则,通过这些规则,在使用EF Code-First的时候,可以自动的基于你的领域类配置概念模型.默认约定的命名空间:System.Data.Entity.ModelConfiguration.Conventions; ①schema(模式)  默认情况下,EF会为所有的数据库