首页 > 代码库 > EF-CodeFirst-3搞事

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看起来像是一对多一样

技术分享

技术分享

EF-CodeFirst-3搞事