1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      EntityFrameworkCore1.1有哪些新特性呢?

      前言

      在項目中用到EntityFramework Core都是現(xiàn)學(xué)現(xiàn)用,及時發(fā)現(xiàn)問題及時測試,私下利用休閑時間也會去學(xué)習(xí)其他未曾遇到過或者用過的特性,本節(jié)我們來講講在EntityFramework Core 1.1中出現(xiàn)了哪些新特性供我們使用。

      創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、巴馬網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為巴馬等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

      EntityFramework Core 1.1新特性探討

      DbSet.Find

      在EF 6.x中也有此方法的實現(xiàn),在EF Core 1.1中也同樣對此方法進行了實現(xiàn),為什么要拿出來講呢,當(dāng)然也有其道理,我們一起來看看。在

              public virtual T Find(int Key)
              {            return _context.Set().Find(Key);
              }

      此時我們來查詢Blog中主鍵等于1的數(shù)據(jù)。

          var blog1 = _blogRepository.Find(1);

      此時我們通過SQL Server Profiler監(jiān)控得到如下SQL。

      EntityFramework Core 1.1有哪些新特性呢?

      我們看到通過Find方法來查詢主鍵等于1的數(shù)據(jù)時,聲明了一個變量然后再來進行設(shè)置變量值進行查詢,沒毛病,上述我們是直接通過Find方法來實現(xiàn),下面我們通過其他幾種方法來實現(xiàn)。如下:

              public T GetSingle(int id)
              {            return _context.Set().FirstOrDefault(x => x.Id == id);
              }
       var blog = _blogRepository.GetSingle(1);

      EntityFramework Core 1.1有哪些新特性呢?

      此時和上述Find方法執(zhí)行的SQL無任何區(qū)別,我們先別著急下結(jié)論,我們再來通過lambda表達式來實現(xiàn)看看。

              public T GetSingle(Expression> predicate)
              {            return _context.Set().FirstOrDefault(predicate);
              }
       var blog = _blogRepository.GetSingle(d => d.Id == 1);

      此時我們再來看看生成的SQL語句。

      EntityFramework Core 1.1有哪些新特性呢?

      此時生成的SQL語句沒有聲明變量看起來非常清爽,同時看過dudu老大剛不久寫過在EF Core中我們聲明的的lambda表達式中的參數(shù)就是我們查詢表的別名,確實是如此,不知道你發(fā)現(xiàn)了沒有。既然以上有多種實現(xiàn)且利用lambda表達式實現(xiàn)更加清爽,那么為何還要搞出一個Find方法呢,請繼續(xù)往下看。

        var blog = _blogRepository.GetSingle(d => d.Id == 1);  var blog1 = _blogRepository.Find(1);

      當(dāng)我們第一次查詢了主鍵等于1的數(shù)據(jù)時,我們第二次通過Find方法再來進行查詢時通過監(jiān)控SQL Server Profiler,你會發(fā)現(xiàn)并未生成任何SQL語句,這說明什么呢,說明EF Core團隊給出Find方法的目的在于:當(dāng)實體已經(jīng)被加載到上下文中時,我們通過Find方法再去查詢數(shù)據(jù)時此時不會再去數(shù)據(jù)庫中進行查詢。所以當(dāng)我們利用主鍵查詢數(shù)據(jù)時利用Find方法會減少對數(shù)據(jù)庫的多次請求。

      ICollection(集合類型映射支持)

      在之前EF版本中我們都是進行如下聲明字段

      EntityFramework Core 1.1有哪些新特性呢?

          public class Blog : IEntityBase
          {        public virtual int Id { get; set; }        public virtual string Name { get; set; }        public virtual string Url { get; set; }        public virtual ICollection Posts { get; set; }
          }

      EntityFramework Core 1.1有哪些新特性呢?

      我們知道在EF Core中已經(jīng)不存在延遲加載這一概念,所以請用了EF Core的童鞋將virtual關(guān)鍵字去掉。同時我們在映射集合時一直以來都統(tǒng)一用的ICollection,但是在EF Core中不再有此局限性,我們進行如下定義:

      EntityFramework Core 1.1有哪些新特性呢?

          public class Blog : IEntityBase
          {        public int Id { get; set; }        public string Name { get; set; }        public string Url { get; set; }        public IEnumerable Posts { get; set; }
          }

      EntityFramework Core 1.1有哪些新特性呢?

      EntityFramework Core 1.1有哪些新特性呢? 

      通過如上我們知道現(xiàn)在支持了IEnumerable集合的映射。當(dāng)然這里有個前提,其具體集合類必須實現(xiàn)ICollection接口,否則EntityFramework Core將無法進行填充。

      Mapping to Fileds(映射到字段)

      這個特性應(yīng)該是前所未有,只有在EF Core 1.1中才出現(xiàn),我們詳細講解下Backing Fileds(我們暫且將其翻譯為返回字段)特性。自從有了如下自動屬性的出現(xiàn),就方便了我們許多。

       public string Url { get; set; }

      什么是返回字段(Backing Fileds)特性,我們先看下原始為字段配置屬性的情況如下:

      EntityFramework Core 1.1有哪些新特性呢?

      private string _url;public string Url
      {     get { return _url; }     set { _url = value; }
      }

      EntityFramework Core 1.1有哪些新特性呢?

      Backing Fileds特性允許EF Core讀或者寫數(shù)據(jù)到字段中而不是屬性中。也就是說如上EF Core將數(shù)據(jù)讀寫到_url字段中而不是Url中。默認(rèn)情況下滿足以下四種規(guī)則都會配置成Backing Fileds。

      • _

      • _

      • m_

      • m_

      比如屬性為UserName,那么對應(yīng)的Backing Fileds則依次是:_userName,_UserName,m_userName,m_UserName。配置Backing Fileds后,當(dāng)從數(shù)據(jù)庫查詢類實例后將直接將其對應(yīng)數(shù)據(jù)寫到字段中,在其他時候當(dāng)EF Core需要讀或者寫值時有可能使用屬性,例如EF需要更新一個屬性上的值時,此時將使用屬性的set訪問器,如果屬性僅僅只是只讀,那么將值寫到字段中。例如如下配置Backing Fileds即_validateUrl。

      EntityFramework Core 1.1有哪些新特性呢?

      class MyContext : DbContext
      {    public DbSet Blogs { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity()
                  .Property(b => b.Url)
                  .HasField("_validatedUrl");
          }
      }public class Blog
      {    private string _validatedUrl;    public int BlogId { get; set; }    public string Url
          {        get { return _validatedUrl; }
          }    public void SetUrl(string url)
          {        using (var client = new HttpClient())
              {            var response = client.GetAsync(url).Result;
                  response.EnsureSuccessStatusCode();
              }
      
              _validatedUrl = url;
          }
      }

      EntityFramework Core 1.1有哪些新特性呢?

      我們也可以在映射中配置使用屬性還是字段,如下:

      modelBuilder.Entity()
          .Property(b => b.Url)
          .HasField("_validatedUrl")
          .UsePropertyAccessMode(PropertyAccessMode.Field);

      若我們在實體中沒有屬性,此時我們可以通過字段來存儲數(shù)據(jù)。我們通過映射中的Porperty(...)來指定字段名稱,若沒有屬性,此時EF Core將會查找字段,如下:

      EntityFramework Core 1.1有哪些新特性呢?

      class MyContext : DbContext
      {    public DbSet Blogs { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity()
                  .Property("_validatedUrl");
          }
      }public class Blog
      {    private string _validatedUrl;    public int BlogId { get; set; }    public string GetUrl()
          {        return _validatedUrl; 
          }    public void SetUrl(string url)
          {        using (var client = new HttpClient())
              {            var response = client.GetAsync(url).Result;
                  response.EnsureSuccessStatusCode();
              }
      
              _validatedUrl = url;
          }
      }

      EntityFramework Core 1.1有哪些新特性呢?

      講了這么多Backing Fileds特性,不知道看到本篇文章的你清楚了它的作用是什么,為什么要提出Backing Fileds特性,它存在的價值或者說用途是做什么呢,就我個人的理解的話,提出Backing Fileds的多數(shù)場景在:如果屬性只讀,我們需要通過其他邏輯操作來獲取其值,但是我們沒有一個橋梁來賦予其值,此時我們就需要Backing Fileds來完成。希望看到此文的你有更多見解的話,請留下評論,一起探討。這里我們結(jié)合上述IEnumerable來進一步講解Backing Fileds。我們在Blog類中是如下定義。

      EntityFramework Core 1.1有哪些新特性呢?

          public class Blog : IEntityBase
          {        public int Id { get; set; }        public string Name { get; set; }        public string Url { get; set; }        public IEnumerable Posts { get; set; }
          }

      EntityFramework Core 1.1有哪些新特性呢?

      我們知道對于導(dǎo)航屬性Posts更多的是通過Inlcude來查詢出Posts,所以在這里我們完全不需要set訪問器以便減少對Posts反編譯為Set方法,我們完全可以改造如下:

       public IEnumerable Posts { get; } =  new List();

      話又說回來了,如果我們?nèi)f一需要對Post進行一些操作,那么在這種情況下該如何是好呢,此時我們通過暴露IEnumerable導(dǎo)航屬性,然后借助該導(dǎo)航屬性的Backing Fileds來對Post進行操作,改造如下:

      EntityFramework Core 1.1有哪些新特性呢?

          public class Blog : IEntityBase
          {        private readonly List _posts = new List();        public int Id { get; set; }        public string Name { get; set; }        public string Url { get; set; }        public IEnumerable Posts => _posts;        public void AddPost(Post post)
              {            // Do some buisness your logic             _posts.Add(post);
              }
          }

      EntityFramework Core 1.1有哪些新特性呢?

      我們實際來操作一下,查詢Blog數(shù)據(jù)以及導(dǎo)航屬性Post數(shù)據(jù)。

      EntityFramework Core 1.1有哪些新特性呢?

              public virtual IEnumerable AllIncluding(params Expression>[] includeProperties)
              {
                  IQueryable query = _context.Set();            foreach (var includeProperty in includeProperties)
                  {
                      query = query.Include(includeProperty);
                  }            return query.AsEnumerable();
              }

      EntityFramework Core 1.1有哪些新特性呢?

      我們進行如下查詢:

       var blog = _blogRepository.GetSingle(d => d.Id == 1, d => d.Posts);

      我們上述稍微改造了一下,為了以免查詢出現(xiàn)錯誤,測試查詢一下,如下,沒毛病。

      EntityFramework Core 1.1有哪些新特性呢? 

      顯式加載(Explicit Loading) 

      貌似顯式加載沒有什么應(yīng)用的場景,不知道是否是應(yīng)對某些特定的場景而給,它只是加載被上下文跟蹤實體的導(dǎo)航屬性,通過Include我們也可以實現(xiàn),如下:

                  var blog = _efCoreContext.Set().Find(1);
                  _efCoreContext.Entry(blog).Collection(b => b.Posts).Load();
                  _efCoreContext.Entry(blog).Reference(b => b.Posts).Load();

      連接彈性(Connection resiliency) 

      所謂的連接彈性則是執(zhí)行數(shù)據(jù)庫命令失敗時我們可以重試,我們可以在OnConfiguring或者Startup.cs中設(shè)置,如下:

      EntityFramework Core 1.1有哪些新特性呢?

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          optionsBuilder
              .UseSqlServer(            "connection string",
                  options => options.EnableRetryOnFailure());
      }

      EntityFramework Core 1.1有哪些新特性呢?

      SQL Server內(nèi)存優(yōu)化表支持

      內(nèi)存優(yōu)化表是SQL Server的一個特性,它將整個表駐留在內(nèi)存中,在磁盤上保留著對表的副本,主要是用于持久化,在數(shù)據(jù)庫恢復(fù)時(比如重啟)在內(nèi)存優(yōu)化表中的數(shù)據(jù)從磁盤上僅僅只是進行讀取。比如對Blog表進行內(nèi)存優(yōu)化設(shè)置,如下:

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity()
              .ForSqlServerIsMemoryOptimized();
      }

      將實體映射到內(nèi)存優(yōu)化中的表,當(dāng)使用EF Core基于我們的模型創(chuàng)建數(shù)據(jù)庫時,此時這些實體也將在內(nèi)存優(yōu)化表中創(chuàng)建一份。

      簡化服務(wù)更換(Simplify switch services)

      在EF Core 1.0中就可以實現(xiàn)服務(wù)更換,但是略顯復(fù)雜,在EF Core 1.1中替換服務(wù)類似于依賴注入一樣,如下:

      EntityFramework Core 1.1有哪些新特性呢?

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          optionsBuilder.UseSqlServer("connection string");
      
          optionsBuilder.ReplaceService();
      }

      EntityFramework Core 1.1有哪些新特性呢?

      在EF 6.x之前版本中因為導(dǎo)航屬性的存在很容易導(dǎo)致循環(huán)引用,所以對于EF Core同樣是如此我們需要在Startup.cs中忽略循環(huán)引用,如下:

       services.AddMvc()
              .AddJsonOptions(
                  options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
              );

      文章名稱:EntityFrameworkCore1.1有哪些新特性呢?
      鏈接分享:http://ef60e0e.cn/article/giopcc.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        大宁县| 东丰县| 汾西县| 林芝县| 茌平县| 峨眉山市| 柯坪县| 沐川县| 隆化县| 兰坪| 庆云县| 平湖市| 黄浦区| 南投县| 凌海市| 嘉峪关市| 镇平县| 安泽县| 兴国县| 广东省| 义马市| 阿城市| 淳安县| 桃园市| 平和县| 桃源县| 广宗县| 赣榆县| 洛川县| 镇原县| 深圳市| 苏尼特右旗| 锡林浩特市| 丹巴县| 图片| 古交市| 柳林县| 邓州市| 茌平县| 仙居县| 安福县|