分类:
MVC
? 配置外键 一:导航属性 外键字段在模型中没有,没法自己去控制联和查询只能使用导航属性 //子表 namespace Model { [Table("UserInfo")] public class UserInfo { [Key] public int id { get; set; } [Required] public string UserName { get; set; } [StringLength(32), Required] public string Number { get; set; } //1外键添加 public virtual Userparent userparent { get; set; } } } 主表 namespace Model { public class Userparent { public int Id { get; set; } public string Father { get; set; } public string Mother { get; set; } public virtual List<UserInfo> users { get; set; } } } 二:导航属性+自定义属性 1: //[Table("UserInfo")] public class UserInfo { [Key] public int id { get; set; } [Required] public string UserName { get; set; } [StringLength(32), Required] public string Number { get; set; } //1外键 [ForeignKey("userparent")] public int UserparentId { get; set; } public virtual Userparent userparent { get; set; } } 2: [Table("UserInfo")] public class UserInfo { [Key] public int id { get; set; } [Required] public string UserName { get; set; } [StringLength(32), Required] public string Number { get; set; } //2外键 public int UserparentId { get; set; } [ForeignKey("UserparentId ")] public virtual Userparent userparent { get; set; } } 三:在上下文对象中重写模型创建,使用fluent api 级联删除 Ef code first默认开启级联删除,从你删除的表,当做主表,把相关的数据全部删除。 //方法一对多来配置 //虚方法 protected override void OnModelCreating(DbModelBuilder modelBuilder) { //一对多来配置后面不加.WillCascadeOnDelete(false)默认开启联表删除 modelBuilder.Entity<UserInfo>().HasRequired(a => a.userparent).WithMany(a => a.users).HasForeignKey(a => a.UserparentId); //方法多对一来配置 modelBuilder.Entity<多的对象名称>().HasMany(a => a.users 多的对象需配置的链接字段 ).WithRequired(a => a.userparent 少的对象须配置的链接字段).HasForeignKey(a => a.UserparentId 少的字段最终确认链接字段 ); modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId).WillCascadeOnDelete(false); //如果关闭级联删除在后面加.WillCascadeOnDelete(false) //fales表示的是关闭联级删除 //true表示的是打开 //全部关闭 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); //生成的表去掉自动生成的后缀名s modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 级联删除的关闭或者开启 1:只删除或者关闭某两个表的关系 modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId).WillCascadeOnDelete(false); } 建议用法:在需要的表加.WillCascadeOnDelete(false); 如果用全局可能会造成数据不小心全部删除 [Table("UserInfo")] public class UserInfo { [Key] public int id { get; set; } [Required] public string UserName { get; set; } [StringLength(32), Required] public string Number { get; set; } //3利用虚方法外键 public int UserparentId { get; set; } public virtual Userparent userparent { get; set; } } namespace DAL { public class ShopContext : DbContext { public ShopContext() : base("name=ShopEetities") { } //虚方法 protected override void OnModelCreating(DbModelBuilder modelBuilder) { //方法一配置1的一方 //modelBuilder.Entity<UserInfo>().HasRequired(a => a.userparent).WithMany(a => a.users).HasForeignKey(a => a.UserparentId); //方法二配置多的一方 //modelBuilder.Entity<多的对象名称>().HasMany(a => a.users 多的对象需配置的链接字段 ).WithRequired(a => a.userparent 少的对象须配置的链接字段).HasForeignKey(a => a.UserparentId 少的字段最终确认链接字段 ); modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId); } public DbSet<UserInfo> UserInfo { get; set; } public DbSet<Userparent> Userparent { get; set; } } } 配置多对多 学生 课程 1 多 多 1 多对多关系,应该有一个中间表,用于关联,关联表至少两个字段,就是两张表的id l 导航属性 只需要在相关联的表增加对方的表名就可以自动生成关系如 public class UserInfo { [Key] public int id { get; set; } [Required] public string UserName { get; set; } [StringLength(32), Required] public string Number { get; set; } //3利用虚方法外键 public int UserparentId { get; set; } public virtual Userparent userparent { get; set; } //相关联的字段 public virtual List<Sub 相关联的表名> Coress { get; set; } } public class Sub { public int Id { get; set; } public string Cores { get; set; } //相关联的字段 public virtual List<UserInfo 相关联的表名> userinfos { get; set; } } l 使用fluentApi 更灵活,关联表的表名,两个外键可以自己灵活控制 l 配置多对多 //配置生成的一张新表表示关系 1. ToTable(自定义新表表名); 2. MapLeftKey(自定义用户的关联字段); 3. MapRightKey(自定义成绩关联的字段); modelBuilder.Entity<UserInfo>().HasMany(a => a.Coress).WithMany(a => a.userinfos).Map(a => { a.ToTable("UserInfo_Sub"); a.MapLeftKey("UserId"); a.MapRightKey("SubId"); }); l 自己维护 最灵活的,不仅可以自己控制表名外键名,还可以自己维护对象已经其他其他字段。 (多对多其实可以理解成两个1对多。可以拆分成两个多对多) ? 数据库迁移 Enable-Migrations启用数据库迁移 Enable-Migrations –EnableAutomaticMigrations 启动自动迁移 Update-Database 更新到数据库
评价