EF之Code First设置主外键关系

https://www.cnblogs.com/zhusk/p/10972546.html

 

指定类外键有注释(DataAnnotation)和FluentAPI两种方式,下面我们主要使用DataAnnotation指定外键关系 
第一种方式

//1-指定导航属性,会自动生成外键,命名规则为:“对象名称_主键名”
 public class TUsers
    {
        [Key]
        public int UserId { get; set; }

        public string Account { get; set; }

        public string Password { get; set; }

        public DateTime CreateDate { get; set; }

        public List<TUsersRoles> TUsersRolesList { get; set; }
    }
     public class TUsersExtInfo
    {
        [Key]
        public int id { get; set; }

        public virtual TUsers Users { get; set; }//生产的外键名称是Users_UserId,格式为"对象名称_主角名称"
    }

 

 

 

 

 第二种方式

//2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键,
public class TUsers
    {
        [Key]
        public int UserId { get; set; }

        public string Account { get; set; }

        public string Password { get; set; }

        public DateTime CreateDate { get; set; }
    }
     public class TUsersExtInfo
    {
        [Key]
        public int id { get; set; }

        public int UserID { get; set; }
        public virtual TUsers Users { get; set; }//如果没有声明TUsers对象,则UserID是一个普通的字段,没有外键关系
    }

 

 

第三种方法:可指定生成的数据库中的列名。

public class TUsers
    {
        [Key]
        public int UserId { get; set; }

        public string Account { get; set; }

        public string Password { get; set; }

        public DateTime CreateDate { get; set; }
    }
    public class TUsersExtInfo
    {
        [Key]
        public int id { get; set; }

        public int TUsers_Id { get; set; }
        [ForeignKey("TUsers_Id")]
        public virtual TUsers Users { get; set; }
    }

 

 

 

 

第四种方法:可指定生成的数据库中的列名

//方式2的升级版,与导航属性的主键名称相同的字段会自动被标记为外键,然后指定字段对应的数据库中的列名
public class TUsers
    {
        [Key]
        public int UserId { get; set; }

        public string Account { get; set; }

        public string Password { get; set; }

        public DateTime CreateDate { get; set; }
    }
     public class TUsersExtInfo
    {
        [Key]
        public int id { get; set; }

        [Column("TUsers_Id")]
        public int UserId { get; set; }
        public virtual TUsers Users { get; set; }
    }

 

 

第五种方式,在DbContent中指定

protected override void OnModelCreating(DbModelBuilder mb)
{
            Database.SetInitializer<DbWrongBooksContext>(null);

            mb.Entity<User>().ToTable("User");
            mb.Entity<Role>().ToTable("Role");
            mb.Entity<UserRole>();

            mb.Entity<User>()
                .HasMany(x => x.Roles)
                .WithMany(x => x.Users)
                .Map(m =>
                {
                    m.ToTable("UserRole");      //中间关系表表名
                    m.MapLeftKey("UserId");     //在中间表主键名
                    m.MapRightKey("RoleId");    //在中间表主键名
                });

}

 

posted @ 2022-01-05 18:21  Haoeaoi  阅读(720)  评论(0编辑  收藏  举报