MySQL via EF6 的試用報告

MySQL via EF6 的試用報告
1、如何通過 EF6 來連接 MySQL?
2、如何通過 EF6 來實現 CRUD?
2.1、Create 添加
2.2、Retrieve 查詢
2.3、Update 修改
2.4、Delete 刪除
3、如何更好的運用 EF6 來完成工作?
3.1、傳說中 EF 的三種模式
3.2、EF6 執行原生 SQL 查詢
3.3、EF6 執行原生 SQL 增刪改
3.4、EF6 不推薦的 CRUD 寫法
3.5、EF6 性能優化
3.6、EF6 開發及調試技巧
4、總結
4.1、MySQL 官方組件的用途說明
4.2、本文 Demo 的代碼補充說明
公司的項目中用的 ORM 是 Dapper,代碼中充斥著大量的 SQL 語句,為了少寫 SQL 語句,領導讓我把 EF6 也加進去看會不會有問題。按照指示,我在新的代碼分支引入了 EF6 并做了 CRUD 的測試,結論是混合使用 Dapper 和 EF6 沒問題。為了讓團隊中沒用過 EF 的同事也能快速上手 EF,我把我的試用記錄重新整理了一下,于是乎就有了本文。

1、如何通過 EF6 來連接 MySQL?
1、安裝 MySQL 的 .NET 驅動

要在 .NET 項目中連接 MySQL 首先得安裝 MySQL 的 .NET 驅動。這個驅動是向下兼容的,官方下載地址:MySQL Connector/NET。

2、安裝 MySql.Data.EntityFramework

Install-Package MySql.Data.EntityFramework -Version 8.0.15
上面的 NuGet 命令會自動幫你把 EF6 和 MySql.Data 都安裝好,無需額外再安裝。

3、創建模型類

有了和數據庫中表對應的模型類,才能方便的操作數據庫而不必寫 SQL 語句。如定義一個 Person 實體,示例如下:

[Table("person")] // 這里不僅可以自定義表的 Name 還可以自定義表的 Schema
public class Person {

[Key]
public Int32 ID { get; set; }
public String Name { get; set; }
public DateTime Birthday { get; set; }
public Int32 NationID { get; set; }
public Nation Nation { get; set; }

}
定義實體的注意事項:

1、模型類名與表名不必相同。如果不同,則需要用 TableAttribute 標注一下;如果相同,則可以省略該 Attribute。
2、主鍵名不必非得是 ID。如果不是,則需要用 KeyAttribute 標注一下;如果是 ID,則可以省略該 Attribute。EF 遵循“約定大于配置”的開發原則,比如 EF 中主鍵名默認為 ID 就是 EF 的一個內置約定,EF 還支持自定義約定。
4、創建數據庫上下文類

有了數據庫上下文,就可以連接數據庫了,然后在上下文中定義相應的 DbSet(實體對象集合),就能直接對數據庫進行 CRUD 操作了。如創建一個 Demo 的上下文,示例如下:

public class DemoDbContext : DbContext {

// 聲明 DbSet,實現 CRUD 的方法定義在 DbSet 中
public DbSet<Person> Persons { get; set; }
public DbSet<Nation> Nations { get; set; }public DemoDbContext() : base("name=ConnectionString") {// 關閉遷移,EF Code First 默認會在 Model 發生改變后自動更新數據庫Database.SetInitializer<DemoDbContext>(null);
}protected override void OnModelCreating(DbModelBuilder modelBuilder) {base.OnModelCreating(modelBuilder);// 解決表名變復數的問題,EF 生成 SQL 語句時默認會將實體名變成復數modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

}
定義上下文的注意事項:

1、創建的數據庫上下文類必須繼承 DbContext 類。
2、在上下文類的構造函數中通過 base 的方式指定數據庫連接字符串。base 的參數寫法有多種,常見的寫法如下:
base("ConnectionString")
base("name=ConnectionString")
base(new MySqlConnection("..."), false)
3、由于 EF 的遷移功能過于復雜,且非必要,一般不用,在構造函數中關閉即可。
4、EF 默認生成的表名是 Model 名的復數,可在 OnModelCreating 中移除該轉換規則。
2、如何通過 EF6 來實現 CRUD?
2.1、Create 添加
1、向一個表中添加一條數據,示例如下:
using (var context = new DemoDbContext()) {

var p = new Person() { Name = "Andy", Gender = 1 };
context.Persons.Add(p);
context.SaveChanges(); // 返回受影響行數 1

}
上面的代碼會生成 1 條 INSERT 語句和 1 條 SELECT 語句。

2、同時向存在主外鍵的兩個表中添加一條數據,示例如下:
using (var context = new DemoDbContext()) {

var n = new Nation() { Name = "China" };
var p = new Person() { Name = "Mark", Gender = 1, NationID = n.ID };
context.Nations.Add(n);
context.Persons.Add(p);
context.SaveChanges(); // 返回受影響行數 2

}
上面的代碼會生成 1 條 INSERT 語句和 2 條 SELECT 語句。

3、一次添加多個并附加事務:
String connectionString = "server=localhost;port=3306;database=demo;uid=root;pwd=";
using (MySqlConnection connection = new MySqlConnection(connectionString)) {

connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();try {using(var context = new DemoDbContext(connection)) {context.Database.UseTransaction(transaction);List<Person> ps = new List<Person>();ps.Add(new Person { Name = "Mark",  Gender = 1 });ps.Add(new Person { Name = "Jack", Gender = 1 });ps.Add(new Person { Name = "Tom", Gender = 1 });context.Persons.AddRange(ps);context.SaveChanges();}transaction.Commit();                    
} catch {transaction.Rollback();throw;
}

}
2.2、Retrieve 查詢
1、EF 查詢支持 LINQ 寫法,必須在最后調用ToList()才會執行查詢,示例如下:
using (var context = new DemoDbContext()) {

context.Database.Log = Console.WriteLine;
var list1 = (from p in context.Persons where p.ID == 1 select p).ToList();
var list2 = (from p in context.Persons select p.Name).ToList();                
var query = from p in context.Persons select p;
query = from p in query where p.ID >= 1 select p;
query = from p in query where p.NationID == 1 select p;
query = from p in query orderby p.Name descending select p;
query.ToList();

}
2、EF 查詢支持 Lambda 寫法,示例如下:
using (var context = new DemoDbContext()) {

context.Database.Log = Console.WriteLine;
// LIMIT 1
var p1 = context.Persons.FirstOrDefault();
// LIMIT 2,不會做參數化處理
var p2 = context.Persons.Single(p => p.ID == 5);
// LIMIT 2,會自動做參數化處理
var p3 = context.Persons.Find(3);
// 會自動做參數化處理
var p4 = context.Persons.Where(p => p.Name.Contains("Andy")).ToList();
// 只查詢部分數據行,可用這個實現分頁查詢
var p5 = context.Persons.OrderBy(p => p.Name).Skip(3).Take(5).ToList();
// 帶條件的分頁查詢
var p6 = context.Persons.Where(p => p.ID > 0).OrderBy(p => p.Name).Skip(3).Take(5).ToList();

}
3、查詢關聯數據,示例如下:
using (var context = new DemoDbContext()) {

var persons = context.Persons.Include(p => p.Nation).ToList();

}
上面的代碼會生成 1 條內連接 SELECT 語句。

2.3、Update 修改
1、修改一條確定存在的數據時,用如下語句:
using (var context = new DemoDbContext()) {

var p = new Person() { ID = 3, Name = "Andy" };
context.Persons.Attach(p);
context.Entry(p).Property(i => i.Name).IsModified = true;
context.SaveChanges(); // 返回受影響行數

}
上面的代碼會生成 1 條 UPDATE 語句,數據不存在時會報錯。

2、如果需要確認數據存在后再修改的話,用如下語句:
using (var context = new DemoDbContext()) {

var p = context.Persons.Find(1); // 也可以用 FirstOrDefault 或其它查詢方法
if (p != null) {p.Name = "Peter";context.Persons.Attach(p);context.Entry(p).Property(i => i.Name).IsModified = true; // 指定更新字段context.SaveChanges(); // 返回受影響行數
}

}
上面的代碼會生成 1 條 UPDATE 語句和 1 條 SELECT 語句。

2.4、Delete 刪除
1、刪除一條確定存在的數據時,用如下語句:
using (var context = new DemoDbContext()) {

var p = new Person() { ID = 1 };
context.Persons.Attach(p);
context.Persons.Remove(p);
context.SaveChanges(); // 返回受影響行數

}
上面的代碼會生成 1 條 DELETE 語句,數據不存在時會報錯。

2、如果需要確認數據存在后再刪除的話,用如下語句:
using (var context = new DemoDbContext()) {

var p = context.Persons.FirstOrDefault(it => it.ID == 1);
if (p != null) {context.Persons.Attach(p);context.Persons.Remove(p);context.SaveChanges();
}

}
3、如何更好的運用 EF6 來完成工作?
技術好的人經常講業務場景,相反,有些技術差的人卻喜歡不由分說的吐槽那些他根本就沒搞懂的技術。在 .NET 圈子里,有人對 EF 是愛不釋手,也有人對 EF 是各種吐槽。

我很喜歡的一句話是:“沒有不好的技術,只有沒被用好的技術”,我的理解是任何技術都有局限性,作為程序員,我們要做的是結合實際業務場景來選用最合適的技術。要想在項目中更好的運用 EF,就得更多的了解 EF 技術,本節就來分享一下我試用 EF6 過程中的一些收獲。

3.1、傳說中 EF 的三種模式
為什么說 EF 的三種模式是傳說呢?因為新版的 EF 默認只支持 Code First 這一種模式了。要想用 Database First 或 Model First 還得把 Visual Studio 降級到 VS10 或 VS12 才行,實在沒必要,下面簡單羅列下每種模式的特點:

1、Database First:即數據庫優先,先創建好數據庫和表,然后自動生成 EDM(實體數據模型)文件,再由 EDM 文件生成模型類。當現有數據庫結構比較成熟穩定時,可用這種模式實現快速開發。
2、Model First:即模型優先,先創建可視化的 EDM 文件,然后由 EDM 文件來自動生成模型類和數據庫。開發速度快,但代碼冗余。寫個小 Demo 還行,但企業級開發一般沒人用這個模式。
3、Code First:即代碼優先,先寫好模型類,然后自動生成數據庫,沒有 EDM 文件。代碼簡潔可控,也是官方和業界首推的模式。
3.2、EF6 執行原生 SQL 查詢
總會有些時候,我們為了性能或者其它各種各樣的緣故,而不得不寫 SQL 語句,EF 提供了直接執行 SQL 語句的方法SqlQuery()。

1、執行無參數的原生 SQL 查詢,示例如下:
using (var context = new DemoDbContext()) {

var persons = context.Persons.SqlQuery("SELECT * FROM Person").ToList();

}
2、執行帶參數的原生 SQL 查詢,示例如下:
using (var context = new DemoDbContext()) {

var sql = "SELECT t.* FROM Person t WHERE t.Gender=@Gender";
var p1 = context.Persons.SqlQuery(sql, new MySqlParameter("@Gender", 1)).ToList();
// 下面這種更簡單的寫法相當于上面兩句,EF 會自動將其轉換為參數化查詢
var p2 = context.Persons.SqlQuery("SELECT t.* FROM Person t WHERE t.Gender={0}", 1).ToList();

}
3、只查詢部分可選字段,示例如下:
using (var context = new DemoDbContext()) {

var persons = context.Database.SqlQuery<MiniPerson>("SELECT t.ID,t.Name FROM Person t").ToList();

}
注意:這里用的是MiniPerson類,而不是模型類Persons,因為用模型類時,查詢返回的字段必須與其模型中的字段對應,而用非模型類時則沒有這個限制,EF 會自動把值賦給相應的字段,并忽略其它字段,即便完全不匹配也不會報錯。

4、統計表中的數據條數,示例如下:
using (var context = new DemoDbContext()) {

var count = context.Database.SqlQuery<Int32>("SELECT COUNT(1) FROM Person").SingleOrDefault();

}
其實 EF 的SqlQuery()還支持調用存儲過程,但實際開發中,一般最好不要存儲過程。因為一旦用了存儲過程,相比較得到的性能提升,往往付出的維護代價會更大,得不償失。

3.3、EF6 執行原生 SQL 增刪改
EF6 調用增刪改等命令語句的方法是ExecuteSqlCommand(),示例如下:

using (var context = new DemoDbContext()) {

context.Database.ExecuteSqlCommand("INSERT INTO Person VALUES(DEFAULT,'小明',NOW(),1)");
context.Database.ExecuteSqlCommand("UPDATE Person SET Name='小王' WHERE ID=8");
context.Database.ExecuteSqlCommand("DELETE FROM Person WHERE ID=14");

}
一般用 EF 就是為了不寫 SQL 語句,尤其是大多數時候不會造成性能問題的增刪改語句,所以使用ExecuteSqlCommand()的概率是比較低的。

3.4、EF6 不推薦的 CRUD 寫法
有些朋友通過別人的帖子發現直接更改實體狀態也能修改數據,然后就一直這么用。但如果你不是很了解 EF 的實體狀態管理機制,就很可能會給自己挖坑,所以一般不推薦這種 CRUD 的寫法。

我多次看到網上有人問諸如 EF 改了數據保存報錯之類的問題,基本都是他自己還沒搞清楚 EF 各個實體狀態的含義,然后就在那兒強制更改實體狀態,然后遇到坑自己還解決不了。這種做法有可能還會破壞 EF 的樂觀并發控制,而且有些版本也不支持這種做法。下面給出兩個負面案例:

1、不推薦的修改寫法,會更新所有字段,示例如下:
using (var context = new DemoDbContext()) {

context.Database.Log = Console.WriteLine;
var p = new Person() { ID = 3, Name = "Andy" };
context.Entry(p).State = EntityState.Modified;
context.SaveChanges(); // 返回受影響行數 1

}
上面的代碼會生成 1 條 UPDATE 語句。

2、不推薦的刪除寫法,示例如下:
using (var context = new DemoDbContext()) {

var p = new Person() { ID = 1 };
context.Entry(p).State = EntityState.Deleted;
context.SaveChanges(); // 返回受影響行數 1

}
上面的代碼會生成 1 條 DELETE 語句。

3.5、EF6 性能優化
1、非跟蹤查詢 AsNoTracking
默認情況下,EF 會一直跟蹤實體的狀態,這也是為什么當我們調用SaveChanges()的時候,EF 能夠把最終的數據狀態準確提交到數據庫的原因。但有些時候,我們查詢出數據只是為了做展示,并不需要修改或刪除,這時候就可以調用AsNoTracking()來使得對象為 Detached 狀態,之后 EF 就不再跟蹤這個對象狀態了,在合適的場景下能顯著提升性能。
using (var context = new DemoDbContext()) {

// 查詢所有人并且不跟蹤他們的狀態
var p1 = context.Persons.AsNoTracking().ToList();
// 查詢部分人并且不跟蹤他們的狀態
var p2 = context.Persons.Where(i => i.NationID == 1).AsNoTracking().ToList();

}
2、EF 默認是開啟了 LoayLazy 的,別手賤關了就行。如下是默認配置:
this.Configuration.ProxyCreationEnabled = true;
this.Configuration.LazyLoadingEnabled = true;
3.6、EF6 開發及調試技巧
1、如果想知道 EF 會執行什么 SQL 語句,比如是控制臺項目,在執行代碼塊中增加如下語句即可:
context.Database.Log = Console.WriteLine;
2、如果是自己測試,可以讓 EF 每次都根據代碼更新數據庫,在上下文構造函數中增加如下代碼即可:
// 當數據庫模型發生改變時,則刪除當前數據庫,重建新的數據庫(實際開發中永遠不要這么寫,太危險了)
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
或者在 CRUD 代碼塊中加入如下代碼,僅當數據庫不存在時,才由 EF 創建數據庫:

context.Database.CreateIfNotExists();
4、總結
本文主要講解了如何快速上手 EF6 和基本的 CRUD 操作。用 .NET 技術的博友都知道,如今 .NET 陣營除了經典的 .NET Framework 之外,還有一個開源版的 .NET Core。對應的,EF 也適時地推出了 EF Core 版,如果你的項目是 .NET 的,那就繼續用 EF6 吧,畢竟是久經考驗的版本,而 EF Core 是全新開發的,更適合 .NET Core 類型的項目。而且官方也說從 EF6 到 EF Core 是移植而不是升級。

4.1、MySQL 官方組件的用途說明
1、mysql-connector-net:MySQL Connector/NET 是 MySQL 官方的 .NET 驅動程序,或者說是 MySQL for .NET 的客戶端開發包,其中包含了 .NET 連接 MySQL 所必須的 dll 文件。
2、mysql-for-visualstudio:6.7 以下版本的驅動中會包含該組件,它的作用是在通過 VS 建立實體模型時,在數據源中增加 MySQL 類型選項。如果只用 Code First,那么就不需要該組件了。
3、mysql-connector-odbc:MySQL Connector/ODBC 使得用戶可以通過 ODBC(Open Database Connectivity,開放數據庫互聯)來連接 MySQL 服務器。
4.2、本文 Demo 的代碼補充說明
文中的 Nation 實體定義如下:
public class Nation {

public Int32 ID { get; set; }
public String Name{ get; set; }

}
文中的 MiniPerson 類定義如下:
public class MiniPerson {

public Int32 ID { get; set; }
public String Name { get; set; }

}
本文鏈接:http://www.cnblogs.com/hanzongze/p/ef6-trial-report.html
版權聲明:本文為博客園博主 韓宗澤 原創

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251879.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java暑假作業

一.《大護法》觀影有感 ... 從預告開始就期待著這部影片&#xff0c;在看過一遍后又忍不住二刷&#xff0c;影片觀看至第二遍后&#xff0c;對于全片的脈絡也更清晰了一點&#xff0c;雖然打著暴力美學的旗子&#xff0c;但《大護法》偏偏更文藝一些。文藝片是沒有對錯的&a…

使用EasyNetQ組件操作RabbitMQ消息隊列服務

RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue)的開源實現&#xff0c;是實現消息隊列應用的一個中間件&#xff0c;消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合&#xff0c;異步消息&#xff0c;流量削鋒等問題。實現高性能&#xff0c;…

context-param和init-param的區別

http://www.cnblogs.com/hzj-/articles/1689836.html 轉載于:https://www.cnblogs.com/wangc04/p/7501054.html

TensorFlow 1.12.2 發布,修復 GIF 構造安全漏洞

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; TensorFlow 1.12.2 發布了&#xff0c;此處本修復了一個潛在的安全漏洞&#xff1a; 精心設計的 GIF 圖像可以在解碼過程中產生空指針解引用更新說明&#xff1a; https://github.com/tensorflo…

【教程】如何在標簽打印工具TFORMer Designer中自定義布局?

TEC-IT的在線標簽生成器TFORMer Designer提供標簽打印服務&#xff0c;并提供即用型行業標簽模板作為Web服務。使用此軟件&#xff0c;您可以在幾秒鐘內創建您自己的標簽和表格或在工業和物流業中使用即時可用的模板。TFORMer Designer的最新更新現在允許使用自定義標簽布局。 …

對象變為指定格式的數組

拿到的對象的格式&#xff08;一個對象里面都好多屬性&#xff09; 想要轉換成的數據格式&#xff08;一個數組里面有好多個對象&#xff0c;每個對象有一個id和name的屬性&#xff09; 如何處理的 selectionChange(val) { // 列表選擇var dynamicTags1 [];var arr[]for(var i…

bootstrapValidator remote 驗證問題

1 加載jQuery和bootstrap.min.js 后引入bootstrapValidator.min.js字段驗證之remote 遠程驗證(類似ajax驗證)&#xff0c;返回值必須是 {"valid":true}{"valid":false} true表示 驗證通過 false 表示驗證不通過。 當添加remote 驗證后&#xff0c;驗證通過…

世界頂級的程序員們告訴你:這些書都是你應該讀的

在很早之前就想整理一份來自經驗豐富的頂級程序員推薦閱讀的書籍清單&#xff0c;全棧工程師Dmitry Shvetsov整理了Bob叔以及Jeff Atwood and DHH等世界知名程序員曾經在博客中推薦過的書單&#xff0c;下面我們就一起來看看深受大神們青睞的書籍都是哪些?世界頂級的程序員們告…

《20170911-構建之法:現代軟件工程-閱讀筆記》

第一章&#xff1a; 介紹軟件工程和軟件的關系&#xff0c;軟件程序軟件工程。 軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。 計算機科學這一學術領域可以分為以下這些偏理論的領域&#xff1a; 1.計算機理論 2.信息和編碼理論 3.算法和數…

mysql學習(2)索引的本質

2019獨角獸企業重金招聘Python工程師標準>>> 問題&#xff1a;SQL查詢慢怎么辦&#xff1f; 優化手段&#xff0c;加索引。 索引是幫助MYSQL高效的獲取數據的排好序的數據結構。 問題&#xff1a;索引結構為什么使用Btree而不使用二叉樹&#xff0c;紅黑樹或者HASH結…

bzoj4245: [ONTAK2015]OR-XOR

一道很有意思的題目。 先求一次前綴和&#xff0c;可以發現答案是 (sum[0] xor sum[x1])or(sum[x1] xor sum[x2])or(sum[x2] xor sum[x3])or……or(sum[m-1] xor sum[n]) 然后其實&#xff08;a xor b&#xff09;or b a or b 那么sum[0]0,可以把柿子變成 sum[x1] or sum[x2] o…

移動端常見的一些兼容性問題

1、安卓瀏覽器看背景圖片&#xff0c;有些設備會模糊。 是devicePixelRatio作怪&#xff0c;因為手機分辨率太小&#xff0c;如果按照分辨率來顯示網頁&#xff0c;這樣字會非常小&#xff0c;所以蘋果當初就把iPhone 4的960*640分辨率&#xff0c;在網頁里只顯示了480*320&…

go-變量

這次我們學習一下golang語言 gitee: go-study 定義 定義的變量或者函數必須用到(pakeage內的全局除外) var a int // 默認為0 var b string //默認為"" fmt.Printf("%d %q\n",a, s) 復制代碼直接定義可以不寫類型(int..)go會自行判斷 var a, b 3, 4 var …

CSS3:CSS3 文本效果

ylbtech-CSS3&#xff1a;CSS3 文本效果1.返回頂部 1、CSS3 文本效果 CSS3 文本效果 CSS3中包含幾個新的文本特征。 在本章中您將了解以下文本屬性&#xff1a; text-shadowbox-shadowtext-overflowword-wrapword-break瀏覽器支持 屬性 text-shadow4.010.03.54.09.5box-sha…

洛谷 P2296 尋找道路

題目描述 在有向圖G 中&#xff0c;每條邊的長度均為1 &#xff0c;現給定起點和終點&#xff0c;請你在圖中找一條從起點到終點的路徑&#xff0c;該路徑滿足以下條件&#xff1a; 1 &#xff0e;路徑上的所有點的出邊所指向的點都直接或間接與終點連通。 2 &#xff0e;在滿足…

Feature Preprocessing on Kaggle

剛入手data science, 想著自己玩一玩kaggle&#xff0c;玩了新手Titanic和House Price的 項目, 覺得基本的baseline還是可以寫出來&#xff0c;但是具體到一些細節&#xff0c;以至于到能拿到的出手的成績還是需要理論分析的。 本文旨在介紹kaggle比賽到各種原理與技巧&#xf…

十天沖刺-04

昨天&#xff1a;完成了日歷界面的部署&#xff0c;并且能夠獲取到選中的日期 今天&#xff1a;完成根據日期查找消費記錄功能 問題&#xff1a;日歷界面占用屏幕太多&#xff0c;后期會進行調整轉載于:https://www.cnblogs.com/liujinxin123/p/10760254.html

構建Spring Boot程序有用的文章

構建Spring Boot程序有用的文章&#xff1a; http://www.jb51.net/article/111546.htm轉載于:https://www.cnblogs.com/xiandedanteng/p/7508334.html

如果您遇到文件或數據庫問題,如何重置Joomla

2019獨角獸企業重金招聘Python工程師標準>>> 如果您遇到Joomla站點的問題&#xff0c;那么重新安裝其核心文件和數據庫可能是最佳解決方案。 了解問題 這種方法無法解決您的所有問題。但它主要適用于由Joomla核心引起的問題。 運行Joomla核心更新后&#xff0c;這些…

數組初始化 和 vector初始化

int result[256] {0}; 整個數組都初始化為0 vector<int> B(length,1); 整個vector初始化為1 如果你定義的vector是這樣定義的&#xff1a; vector<int> B; 去初始化&#xff0c;千萬不要用&#xff1a; for(int i 0;i < length;i)B[i] 1; 這樣會數組越界&…