欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

EntityFrameworkCore1.1有哪些新特性呢?

前言

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

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

EntityFramework Core 1.1新特性探討

DbSet.Find

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

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

此時(shí)我們來(lái)查詢(xún)Blog中主鍵等于1的數(shù)據(jù)。

    var blog1 = _blogRepository.Find(1);

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

EntityFramework Core 1.1有哪些新特性呢?

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

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

EntityFramework Core 1.1有哪些新特性呢?

此時(shí)和上述Find方法執(zhí)行的SQL無(wú)任何區(qū)別,我們先別著急下結(jié)論,我們?cè)賮?lái)通過(guò)lambda表達(dá)式來(lái)實(shí)現(xiàn)看看。

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

此時(shí)我們?cè)賮?lái)看看生成的SQL語(yǔ)句。

EntityFramework Core 1.1有哪些新特性呢?

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

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

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

ICollection<T>(集合類(lèi)型映射支持)

在之前EF版本中我們都是進(jìn)行如下聲明字段

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<Post> Posts { get; set; }
    }

EntityFramework Core 1.1有哪些新特性呢?

我們知道在EF Core中已經(jīng)不存在延遲加載這一概念,所以請(qǐng)用了EF Core的童鞋將virtual關(guān)鍵字去掉。同時(shí)我們?cè)谟成浼蠒r(shí)一直以來(lái)都統(tǒng)一用的ICollection<T>,但是在EF Core中不再有此局限性,我們進(jìn)行如下定義:

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<Post> Posts { get; set; }
    }

EntityFramework Core 1.1有哪些新特性呢?

EntityFramework Core 1.1有哪些新特性呢? 

通過(guò)如上我們知道現(xiàn)在支持了IEnumerable<T>集合的映射。當(dāng)然這里有個(gè)前提,其具體集合類(lèi)必須實(shí)現(xiàn)ICollection接口,否則EntityFramework Core將無(wú)法進(jìn)行填充。

Mapping to Fileds(映射到字段)

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

 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讀或者寫(xiě)數(shù)據(jù)到字段中而不是屬性中。也就是說(shuō)如上EF Core將數(shù)據(jù)讀寫(xiě)到_url字段中而不是Url中。默認(rèn)情況下滿(mǎn)足以下四種規(guī)則都會(huì)配置成Backing Fileds。

  • _<camel-cased property name>

  • _<property name>

  • m_<camel-cased property name>

  • m_<property name>

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

EntityFramework Core 1.1有哪些新特性呢?

class MyContext : DbContext
{    public DbSet<Blog> Blogs { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .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<Blog>()
    .Property(b => b.Url)
    .HasField("_validatedUrl")
    .UsePropertyAccessMode(PropertyAccessMode.Field);

若我們?cè)趯?shí)體中沒(méi)有屬性,此時(shí)我們可以通過(guò)字段來(lái)存儲(chǔ)數(shù)據(jù)。我們通過(guò)映射中的Porperty(...)來(lái)指定字段名稱(chēng),若沒(méi)有屬性,此時(shí)EF Core將會(huì)查找字段,如下:

EntityFramework Core 1.1有哪些新特性呢?

class MyContext : DbContext
{    public DbSet<Blog> Blogs { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .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特性,它存在的價(jià)值或者說(shuō)用途是做什么呢,就我個(gè)人的理解的話(huà),提出Backing Fileds的多數(shù)場(chǎng)景在:如果屬性只讀,我們需要通過(guò)其他邏輯操作來(lái)獲取其值,但是我們沒(méi)有一個(gè)橋梁來(lái)賦予其值,此時(shí)我們就需要Backing Fileds來(lái)完成。希望看到此文的你有更多見(jiàn)解的話(huà),請(qǐng)留下評(píng)論,一起探討。這里我們結(jié)合上述IEnumerable<T>來(lái)進(jìn)一步講解Backing Fileds。我們?cè)贐log類(lèi)中是如下定義。

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<Post> Posts { get; set; }
    }

EntityFramework Core 1.1有哪些新特性呢?

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

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

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

EntityFramework Core 1.1有哪些新特性呢?

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

EntityFramework Core 1.1有哪些新特性呢?

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

EntityFramework Core 1.1有哪些新特性呢?

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

EntityFramework Core 1.1有哪些新特性呢?

我們進(jìn)行如下查詢(xún):

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

我們上述稍微改造了一下,為了以免查詢(xún)出現(xiàn)錯(cuò)誤,測(cè)試查詢(xún)一下,如下,沒(méi)毛病。

EntityFramework Core 1.1有哪些新特性呢? 

顯式加載(Explicit Loading) 

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

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

連接彈性(Connection resiliency) 

所謂的連接彈性則是執(zhí)行數(shù)據(jù)庫(kù)命令失敗時(shí)我們可以重試,我們可以在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的一個(gè)特性,它將整個(gè)表駐留在內(nèi)存中,在磁盤(pán)上保留著對(duì)表的副本,主要是用于持久化,在數(shù)據(jù)庫(kù)恢復(fù)時(shí)(比如重啟)在內(nèi)存優(yōu)化表中的數(shù)據(jù)從磁盤(pán)上僅僅只是進(jìn)行讀取。比如對(duì)Blog表進(jìn)行內(nèi)存優(yōu)化設(shè)置,如下:

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

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

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

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

EntityFramework Core 1.1有哪些新特性呢?

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

    optionsBuilder.ReplaceService<SqlServerTypeMapper, MyCustomSqlServerTypeMapper>();
}

EntityFramework Core 1.1有哪些新特性呢?

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

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

網(wǎng)頁(yè)題目:EntityFrameworkCore1.1有哪些新特性呢?
網(wǎng)頁(yè)鏈接:http://chinadenli.net/article22/giopcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、外貿(mào)建站、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站、用戶(hù)體驗(yàn)、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)