【無私分享:ASP.NET CORE 專案實戰(第十三章)】Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離
目錄索引
簡介
MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中間還是有少許的 坑 :
首先,因為大神是比較忙的,而且主要分享關鍵技術,所以有些地方很簡略,而往往這些簡略的地方容易造成新手的困惑。
其次,在嘗試了N次失敗後,我發現大神的代理程式是有問題的,具體是什麼問題,我們待會詳細解釋,經過修改之後的代理程式,可以正常執行。
因此,我覺得很有必要寫這篇文章,一步一步搭建、測試、執行。
什麼是MyCat?
從定義和分類來看,它是一個開源的分散式資料庫系統,是一個實現了MySQL協議的伺服器,前端使用者可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令列訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通訊,也可以用JDBC協議與大多數主流資料庫伺服器通訊,其核心功能是分表分庫,即將一個大表水平分割為N個小表,儲存在後端MySQL伺服器裡或者其他資料庫裡。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支援MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支援MongoDB這種新型NoSQL方式的儲存,未來還會支援更多型別的儲存。而在終端使用者看來,無論是那種儲存方式,在MyCat裡,都是一個傳統的資料庫表,支援標準的SQL語句進行資料的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度。
此外,開發者可以根據不同的需求將表分配不同的資料節點,比如Table A存放在關係型資料庫中(如MySQL),而Table B可能更適合NoSQL(如MongoDB),在MyCAT中開發者只需要簡單配置,即可讓MyCAT完成這一系列操作的路由。
MyCat的優勢
- 基於阿里巴巴的開源專案Cobar,具備良好的穩定性、可靠性、優良的結構和優良的效能,擁有許多的專案案例。站在巨人的肩膀上,MyCAT將走的更遠。
- 廣泛借鑑最好的開源專案和創新的理念,讓這些融入MyCAT的基因,使MyCAT成為領先其他電商等類似的開源專案,甚至超過了一些企業級應用。
- MyCAT技術團隊的參與者都經歷過至少五多年的專案經驗,團隊中包括一些高階軟體工程師、架構師、DBA。由精英們組成的MyCAT技術團隊將確保產品質量。
- MyCAT是完全獨立的社群,不依附於任何企業,遵循著完全開放、免費、開源的原則。它不像一些開源專案,重要的功能封閉在其商業產品,並使開源專案像一個裝飾。
- 支援超過60種的資料庫作為資料節點,如MySQL、SQL Server、Oracle、MongoDB、DB2等
MyCat與ADO.NET
由於MyCAT與MySQL協議有些許差異,開發者可能不能夠直接使用Oracle官方提供的Mysql.Data(ADO層)來與MyCAT直接連線,因此有大神專門為.NET開發者設計了針對MyCAT優化過的ADO層驅動,即 Pomelo.Data.MyCat,開發者通過使用MyCatConnection、MyCatCommand類可以實現對MyCAT的連線與查詢。
MyCat 與 Entity Framework Core
由於MyCAT的協議與MySQL有所差異,導致了無論是Java平臺下的Hibernate還是.NET下的Entity Framework都無法使用MySQL的provider直接來操作MyCAT。這點在EF中的Migrations以及Code First上表現的尤為明顯,此外開發者不僅需要手動建庫,還需要配置分片規則等,操作繁瑣。
因此我們使用第三方專門為MyCAT量身打造的Entity Framework Core Provider,即 Pomelo.EntityFrameworkCore.MyCat。
安裝Java8
MyCat 需要 java cdk的支援,安裝方法網上很多很詳細,這裡我們就不羅列了。
下載MyCat Server
廢話不多說,我們來開始我們的MyCat之旅:
我們演示使用的伺服器是:CentOS7 當然,Windows 也是支援的,我們以 CentOS為例。
首先,我們在伺服器安裝 MySQL ,這裡我安裝的是 MySQL 5.7,關於 MySQL的安裝,我們這裡就不演示了,沒有裝過的朋友,網上有大片的詳細安裝步驟。值得注意的是,安裝完MySQL之後,我們需要編輯 my.cnf 檔案,將MySQL的預設編碼設定為 UTF8 。
我們下載 MyCat Server :我是通過 wget XXXXXXXX;大家也可以直接下載下來,然後通過 FTP 傳到伺服器上。
因為我們是Linux,所以我選擇 linux.tar.gz,使用 Windows的朋友可以選擇 win.tar.gz
[[email protected] ~]# wget https://github.com/MyCATApache/Mycat-download/blob/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20160816173057-linux.tar.gz
解壓 MyCat Server 壓縮包:[[email protected] ~]# tar -xzvf Mycat-server-1.5.1-RELEASE-20160816173057-linux.tar.gz
將檔案移動至 /usr/local/mycat 目錄下:[[email protected] ~]# mv mycat /usr/local/mycat
這樣,我們的 MyCat Server,就完成了,我們來執行一下:
開啟mycat/bin目錄,執行 ./mycat start ,通過 ./mycat status 檢視 mycat的執行情況
啟動:./mycat start 重新啟動:./mycat restart 停止:./mycat stop 狀態:./mycat status
下載 執行代理程式
這個代理程式是由問題的,我們前面說過了,我們先來嘗試一下,對於出現的問題和解決方式,我們再講解。
我們先下載這個代理程式,下在方法跟上面 MyCat Server 一樣,可以使用多種方式,大家可以直接下載到本地,解壓完成後,把解壓的檔案通過FTP上傳至proxy目錄,我這裡還是使用 wget
[[email protected] ~]# wget https://github.com/PomeloFoundation/Entity-Framework-Core-MyCat-Proxy/releases/download/1.0.0-alpha2/MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip
建立一個目錄 proxy ,將壓縮包移動到此目錄下:
[[email protected] ~]# mkdir proxy
[[email protected] ~]# mv MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip proxy/MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip
進入 proxy ,並解壓 MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip 壓縮包:
[[email protected] ~]# cd proxy
[[email protected] proxy]# unzip MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip
編輯 config.json 檔案,修改 MyCatRoot為"/usr/local/mycat":
安裝.NET Core SDK for CentOS
執行代理程式
我們來執行一下代理程式:[[email protected] proxy]# dotnet Pomelo.EntityFrameworkCore.MyCat.Proxy.dll
我們先不管在程式中是怎麼實現MyCat的,這個後面我們再講,我們先來測試一下這個代理程式,不先解決這個代理的問題,到後面都很難知道到底是程式出錯還是伺服器的問題還是代理的問題:
我在VS2015的控制檯裡執行:Add-Migration MySQL_Init(也可以使用命令:dotnet ef Migrations add MySQL_Init)
出錯了。。。這個錯誤是操作超時了,這極有可能是連線不上MyCat伺服器,這個問題曾困擾了我一段時間,後來突然發現忽略了一個重要的東西,防火牆。。。
我們的代理使用的是7066埠,我們來開啟一下防火牆埠,並重啟防火牆:
[[email protected] ~]# firewall-cmd --zone=public --add-port=7066/tcp --permanent
[[email protected] ~]# systemctl restart firewalld
我們再來執行 Add-Migration MySQL_Init :
建立資料庫: Update-Database -Verbose (dotnet ef database update)
建立成功,看似沒有什麼問題。
我們來插入幾條資料看下:出錯了 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
超時,伺服器沒有響應。這是怎麼回事呢,我們通過 Navicat 來連線一下 MyCat(同樣伺服器防火牆要開啟 8066 埠,預設MyCat 是8066 埠,方法同上):
首先,我們來檢查一下我們的MyCat狀態:
MyCat Server 關閉了。。。我們重啟:
重啟之後,總是自動關閉。這是什麼原因?我們看下日誌(/usr/local/mycat/logs/wrapper.log):
這下看清楚了,是因為rule columns 有多個 values值,這個是什麼東西呢,這是就是配置MyCat 規則的拆分的列的名稱。
我們來看下代理生成的rule(/usr/local/mycat/conf/rule.xml):
也就是說:MyCat 這個拆分規則 只支援單個,但是我們的代理生成了多個,導致 MyCat Server 錯誤。
我這裡修改一下,改成<columns>ID</columins>,MyCat 啟動就沒有問題了,但是問題來了,我這裡有四個實體類,其中有三個的主鍵都是ID,但是有一個的主鍵是UserID,那麼只根據ID拆分顯然是不合理的。
我們來看下 schema (/usr/local/mycat/conf/schema.xml):
大家注意 table 標籤的 rule 屬性,都是 db_wkmvc_rule 跟 rule.xml 的 tableRule 標籤的 name 屬性是對應的。也就是說,這個表,按照 rule=""的規則,根據columns的值(列名,這裡是主鍵也就是ID或UserID)拆分資料。
如何解決?
我想到的方案就是,每個表一個單獨的規則,每個規則的columns值就是當前這個表的主鍵。
我們來看下代理程式的原始碼:
根據方法名稱,我們可以看出這兩個方法應該就是修改 rule.xml 和 schema.xml
我們來看下GenerateRuleXml() :
這一段就是生成xml內容的,為什麼我們的 rule.xml 中的 columns 會生成 諸如:ID,ID,ID,UserID 呢?我們可以很清楚的看出 <columns>{ string.Join(",", s.Keys.First()) }</columns>
在 foreach 迴圈 schema.xml 中 table 標籤的時候,把他們的 Key (primaryKey) 通過 string.join 組合起來了,並且只生成了一個 tableRule
那麼,按照我們的方案,應該是每個表(在 schema.xml 中體現就是 一個 table 標籤),單獨生成一個 規則。
修改起來也很簡單:
我們把迴圈中的 ruleXml="" 改為 rulexml+="",然後把 <columns>{ string.Join(",", s.Keys.First()) }</columns> 改為當前表的 primaryKey :<columns>{ s.Keys.First() }</columns>
這是修改後的完整的 public void GenerateRuleXml(List<MyCatTable> Schema, List<MyCatDataNode> DataNodes, string database, bool IsUnder16)
public void GenerateRuleXml(List<MyCatTable> Schema, List<MyCatDataNode> DataNodes, string database, bool IsUnder16)
{
foreach(var s in Schema)
{
if (s.Keys.Count() != 1)
continue;
string ruleXml = "";
string funcXml = "";
if (IsUnder16)
{
ruleXml += [email protected]"
<tableRule name=""{ database }_{ s.TableName }_rule"">
<rule>
<columns>{ s.Keys.First() }</columns>
<algorithm>{ database }_{ s.TableName }_func</algorithm>
</rule>
</tableRule>
";
funcXml += [email protected]"
<function name=""{ database }_{ s.TableName }_func"" class=""org.opencloudb.route.function.PartitionByMod"">
<property name=""count"">{ s.DataNodes.Count() }</property>
</function>
";
}
else // 1.6+
{
ruleXml += [email protected]"
<tableRule name=""{ database }_{ s.TableName }_rule"">
<rule>
<columns>{ s.Keys.First() }</columns>
<algorithm>{ database }_{ s.TableName }_func</algorithm>
</rule>
</tableRule>
";
funcXml += [email protected]"
<function name=""{ database }_{ s.TableName }_func"" class=""io.mycat.route.function.PartitionByMod"">
<property name=""count"">{ s.DataNodes.Count() }</property>
</function>
";
}
using (var reader = XmlReader.Create(Path.Combine(MyCatRoot, "conf", "rule.xml"), new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }))
{
var xml = new XmlDocument();
xml.Load(reader);
var mycatRule = xml.ChildNodes.Cast<XmlNode>().Single(x => x.Name == "mycat:rule");
foreach (var x in mycatRule.ChildNodes.Cast<XmlNode>().Where(x => (x.Name == "tableRule" && x.Attributes["name"].Value == $"{ database }_{ s.TableName }_rule") || (x.Name == "function" && x.Attributes["name"].Value == $"{ database }_{ s.TableName }_func")).ToList())
mycatRule.RemoveChild(x);
mycatRule.InnerXml = ruleXml + mycatRule.InnerXml;
mycatRule.InnerXml += funcXml;
reader.Dispose();
File.WriteAllText(Path.Combine(MyCatRoot, "conf", "rule.xml"), PatchXml("rule", xml.OuterXml));
}
}
}
我們重新編譯生成,釋出出來上傳至伺服器,替換掉我們之前的代理程式。然後重新執行一下,我們再來看下 rule.xml 和 schema.xml:
是不是按照我們的預期,我們看下MyCat Server的狀態:
MyCat 連線也沒問題了
(後記:關於這個代理的問題,已經提交給作者了,這個代理程式我測試有一段時間了,當時還是alpha1版本,寫文章的時候,我看到 alpha2版本貌似改進了,但是原始碼沒有修改。)
如何在Asp.net Core中使用 Mycat
分兩部分,第一部分就是最簡潔的應用,第二部分是我在專案中的應用,大家自行參考。
第一部分,最簡潔的應用(作者 Demo):
首先,我們新建一個控制檯程式
並將 Pomelo.EntityFrameworkCore.MyCat
新增至 project.json 中(Nuget:Install-Package Pomelo.EntityFrameworkCore.MyCat -Pre)
建立一個Blog模型:
public class Blog
{
public long Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime Time { get; set; }
}
建立DbContext類,並重寫DbContext中的OnConfiguring方法,配置資料節點以及MyCAT伺服器資訊
public class SampleContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseMyCat("server=IP;port=8066;uid=test;pwd=test;database=blogs")
.UseDataNode("IP", "blogs_1", "使用者名稱", "密碼")
.UseDataNode("IP", "blogs_2", "使用者名稱", "密碼")
.UseDataNode("IP", "blogs_3", "使用者名稱", "密碼");
}
}
注意:
.UseMyCat()中的 Server 是 MyCat 伺服器的地址 Uid 和 Pwd 是 MyCat 的 使用者名稱和密碼,不要和資料的混了。
.UseDataNode()中的 Server 是節點資料庫的地址 Uid 和 Pwd 是節點資料庫的 使用者名稱和密碼。
如何檢視 MyCat 的使用者名稱和密碼:
開啟mycat目錄下的 conf 目錄(我們這裡是:/usr/local/mycat/conf)
檢視 server.xml 檔案:
上面插入一段,一般使用mycat的應該都知道這些檔案分別是幹什麼的,我們這裡囉嗦一下。
我把整個的 Program.cs 內容給大家展示一下:
然後,就不多說了,你可以使用控制檯命令 Add-Migration 和 Update-database 也可以使用命令 dotnet ef migrations add 和 dotnet ef database update 執行遷移和其它操作了。
第二部分,我在專案中的應用:
首先,在配置檔案(siteconfig.json)中新增一個是否使用 MyCat 的配置:
然後,同樣在配置檔案(siteconfig.json)中新增資料庫節點配置:
這裡面已經寫了一個 _isUseMyCat 和 GetMyCatConnect(),是否使用 MyCat 這個 跟 資料庫選擇一樣,我們從配置檔案中讀取這個配置返回即可:
我們來重寫一下 GetMyCatConnect 返回 MyCat 和 節點資料庫連線的 DbContextOptionsBuilder:
public DbContextOptionsBuilder GetMyCatConnect(string connectionStr, DbContextOptionsBuilder _options)
{
_options.UseMyCat(connectionStr);
List<MyCatDatabaseHost> hosts = new Services.ConfigServices.AppConfigurtaionServices().GetListAppSettings<MyCatDatabaseHost>("MyCatDatabaseHost");
foreach(var host in hosts)
{
_options.UseDataNode(host.Host, host.Database, host.Username, host.Password, host.Port);
}
return _options;
}
修改一下 Startup.cs :
這樣,我們就實現了對 MyCat的支援和切換,當然,在實際專案中,我們可能不需要這些,使用什麼,是否有必要使用 MyCat 這些可能是早就定好的,因為我這個是測試學習的專案,所以羅列了各種東西。
希望跟大家一起學習Asp.net Core
剛開始接觸,水平有限,很多東西都是自己的理解和翻閱網上大神的資料,如果有不對的地方和不理解的地方,希望大家指正!
雖然Asp.net Core 現在很火熱,但是網上的很多資料都是前篇一律的複製,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!
相關推薦
【無私分享:ASP.NET CORE 專案實戰(第十三章)】Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離
目錄索引 簡介 MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中
【無私分享:ASP.NET CORE 專案實戰(第九章)】建立區域Areas,新增TagHelper
目錄索引 簡介 在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。 其實,這樣也好,通過手動建立,更讓我們深刻的理解M
【無私分享:ASP.NET CORE 專案實戰(第十章)】釋出專案到 Linux 上執行 Core 專案
目錄索引 簡介 ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執
【無私分享:ASP.NET CORE 專案實戰(第六章)】讀取配置檔案(一) appsettings.json
目錄索引 簡介 在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。 部落格園對於這個的
【無私分享:ASP.NET CORE 專案實戰(第八章)】讀取配置檔案(二) 讀取自定義配置檔案
目錄索引 簡介 但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢 解決問題
【無私分享:ASP.NET CORE 專案實戰(第四章)】Code First 建立資料庫和資料表
目錄索引 簡介 本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類 我修改了一下名字,Domains 改為了 wkmvc.Data 我們新建一個
【無私分享:ASP.NET CORE 專案實戰(第七章)】檔案操作 FileHelper
目錄索引 簡介 在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本
【無私分享:ASP.NET CORE 專案實戰(第五章)】Repository倉儲 UnitofWork
1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s
【無私分享:ASP.NET CORE 專案實戰(第三章)】EntityFramework下領域驅動設計的應用
這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改
【無私分享:ASP.NET CORE 專案實戰(第十一章)】Asp.net Core 快取 MemoryCache 和 Redis
1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///
【無私分享:ASP.NET CORE 專案實戰(第十二章)】新增對SqlServer、MySql、Oracle的支援
目錄索引 簡介 增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的
【無私分享:ASP.NET CORE 專案實戰(第十四章)】圖形驗證碼的實現
1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用於生成指定位數的隨機數 5 /// </summary> 6
黃聰:Mysql主從配置,實現讀寫分離
大型網站為了軟解大量的併發訪問,除了在網站實現分散式負載均衡,遠遠不夠。到了資料業務層、資料訪問層,如果還是傳統的資料結構,或者只是單單靠一臺伺服器扛,如此多的資料庫連線操作,資料庫必然會崩潰,資料丟失的話,後果更是 不堪設想。這時候,我們會考慮如何減少資料庫的聯接,一方面採用優秀的程式碼框架,進行程式碼的優
Beginng_Rust(譯):定義通用函式和結構(第十章)(完+1)
在本章中,您將學習: •如何編寫單個函式定義,其呼叫可以有效地處理不同的資料型別 •如何使用型別推斷來避免指定使用的型別 通用功能 •如何編寫單個struct,tuple-struct或enum型別,其例項可以包含有效的不同資料型別 •如何使用兩個重要的標準通用
【無私分享:ASP.NET CORE 專案實戰(第二章)】新增EF上下文物件,新增介面、實現類以及無處不在的依賴注入(DI)
目錄索引 簡介 上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件 按照我們以前的習慣,我們還是新建幾個資料夾 Commons:存放幫助類 Domians:資料模型 Services
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(7.2) 模組管理,模組的新增、修改、刪除
索引 簡述 今天我們來做模組管理的 新增、修改、刪除 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.3) 登入功能的實現,豐富資料表、建立關聯
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_CODE] Script Date: 2016/5/17 9:30:01 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (10)部門管理、崗位管理和員工管理
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_POST_USER] Script Date: 2016/6/20 16:28:44 ******/ 4 SET ANSI_NULLS ON 5 GO
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (12)程式與資料備份
索引 簡述 程式檔案備份與資料備份 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.4) 登入功能的實現,建立與登入使用者相關的介面和實現類
索引 簡述 今天我們建立幾個與登入使用者相關的資料表的介面和實現類 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了