EF經常使用處理關聯加載的方式有3中:延遲加載(Lazy Loading)、貪婪加載 (Eager Loading)以及顯示加載。html
1、EF Core 1.1sql
1.當前的版本,還不支持延遲加載(Lazy Loading),不未來是否支持數據庫
2.目前支持貪婪加載:使用Include加載 關聯表 的數據,這種方式 使用一條Join的 Sql語句進行查詢。ide
3. 貪婪加載的優點在於僅執行1次SQL查詢即返回所須要的結果。但使用JOIN查詢在數據庫記錄條數較多時,多條簡單的SQL查詢每每比一條複雜的JOIN查詢效率要好。post
Include語句能夠在 一次查詢中使用屢次 :ui
ctx.Categories .Include(c => c.Products) .Include(c => c.News);
4.限制加載的方式暫時忽略使用。this
2、EF Core 中主外鍵設置url
1.使用數據註釋,DataAnnotations模式,這種方式適合Code First或者說手寫實體類和自定義主外鍵 關聯。spa
Menu表.net
[Table("Menu")] public partial class Menu { [Key] public int MenuID { get; set; } public string MenuName { get; set; } public string LinkUrl { get; set; } public DateTime AddTime { get; set; } public int SortNumber { get; set; } public int ModelID { get; set; } [ForeignKey("ModelID")] public virtual Model Model { get; set; } }
Model表
[Table("Model")] public partial class Model { public Model() { this.Menus = new HashSet<Menu>(); } [Key] public int ModelID { get; set; } public string ModelName { get; set; } public int SortNumber { get; set; } public DateTime AddTime { get; set; } public virtual ICollection<Menu> Menus { get; set; } }
上下文類
public class MenuModelContext : DbContext { public virtual DbSet<Menu> Menus { get; set; } public virtual DbSet<Model> Models { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;database=MenuModel;Trusted_Connection=True;"); } }
2.使用Fluent API模式,這種方式,是自動DBFirst自動生成實體層的默認方式
Menu表
public partial class Menu { public int MenuId { get; set; } public string MenuName { get; set; } public string LinkUrl { get; set; } public DateTime AddTime { get; set; } public int SortNumber { get; set; } public int ModelId { get; set; } public virtual Model Model { get; set; } }
Model表
public partial class Model { public Model() { Menu = new HashSet<Menu>(); } public int ModelId { get; set; } public string ModelName { get; set; } public int SortNumber { get; set; } public DateTime AddTime { get; set; } public virtual ICollection<Menu> Menu { get; set; } }
上下文類:
public partial class MenuModelContext : DbContext { public virtual DbSet<Menu> Menu { get; set; } public virtual DbSet<Model> Model { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;database=MenuModel;Trusted_Connection=True;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Menu>(entity => { entity.Property(e => e.MenuId).HasColumnName("MenuID"); entity.Property(e => e.AddTime).HasColumnType("datetime"); entity.Property(e => e.LinkUrl).HasMaxLength(200); entity.Property(e => e.MenuName) .IsRequired() .HasMaxLength(10); entity.Property(e => e.ModelId).HasColumnName("ModelID"); entity.HasOne(d => d.Model) .WithMany(p => p.Menu) .HasForeignKey(d => d.ModelId) .OnDelete(DeleteBehavior.Restrict) .HasConstraintName("FK__Menu__ModelID__25869641"); }); modelBuilder.Entity<Model>(entity => { entity.Property(e => e.ModelId).HasColumnName("ModelID"); entity.Property(e => e.AddTime).HasColumnType("datetime"); entity.Property(e => e.ModelName) .IsRequired() .HasMaxLength(10); }); } }
3、使用Include 獲取關聯表數據實例
注 :使用Include 方式獲取的數據爲對應類型的對象,而不是動態類型Dynamic_xxxx
MenuModelContext _Context = new MenuModelContext(); List<Menu> list = _Context.Menus .Include(q => q.Model) //手動指定關聯表查詢,一對一 .ToList(); foreach (var item in list) { Console.WriteLine(item.MenuName); Console.WriteLine(item.Model); }
MenuModelContext _Context = new MenuModelContext(); List<Model> list = _Context.Models .Include(q => q.Menus) //手動指定關聯表查詢,一對多 .ToList(); foreach (var item in list) { Console.WriteLine(item.ModelName); Console.WriteLine(item.Menus.Count); }
更多 :
Ef core的其餘參考:
http://www.cnblogs.com/libingql/p/3381571.html