.NetCore中EFCore的使用整理(二)-關聯表查詢


EF常用處理關聯加載的方式有3中:延遲加載(Lazy Loading)、貪婪加載 (Eager Loading)以及顯示加載。

一、EF Core  1.1

1.當前的版本,還不支持延遲加載(Lazy Loading),不將來是否支持

2.目前支持貪婪加載:使用Include加載 關聯表 的數據,這種方式 使用一條Join的 Sql語句進行查詢。

3. 貪婪加載的優勢在於僅執行1次SQL查詢即返回所需要的結果。但使用JOIN查詢在數據庫記錄條數較多時,多條簡單的SQL查詢往往比一條復雜的JOIN查詢效率要好。

Include語句可以在 一次查詢中使用多次 :

ctx.Categories
    .Include(c => c.Products)
    .Include(c => c.News);

4.限制加載的方式暫時忽略使用。

二、EF Core 中主外鍵設置

1.使用數據注釋,DataAnnotations模式,這種方式適合Code First或者說手寫實體類和自定義主外鍵 關聯。

Menu表

復制代碼
[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);
        });
    }
}
復制代碼

三、使用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);
}
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM