新聞中心
在.NET開(kāi)發(fā)中,訪問(wèn)數(shù)據(jù)庫(kù)是必不可少的一部分。使用ADO.NET可以高效地訪問(wèn)數(shù)據(jù)庫(kù),但是為了減少代碼冗余并提高工作效率,使用Entity Framework是更好的選擇。Entity Framework通過(guò)LINQ來(lái)訪問(wèn)數(shù)據(jù)庫(kù),使代碼更加簡(jiǎn)潔易懂。在使用Entity Framework之前,需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)上下文類,以便作為訪問(wèn)數(shù)據(jù)庫(kù)的入口。本文將介紹如何快速創(chuàng)建數(shù)據(jù)庫(kù)上下文類,以便訪問(wèn)數(shù)據(jù)庫(kù)。

臺(tái)兒ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
1. 創(chuàng)建項(xiàng)目
打開(kāi)Visual Studio,創(chuàng)建一個(gè)新項(xiàng)目。選擇Visual C#,然后選擇“控制臺(tái)應(yīng)用程序”模板。為項(xiàng)目命名,選擇保存位置,并單擊“創(chuàng)建”按鈕。在新創(chuàng)建的項(xiàng)目中,右鍵單擊項(xiàng)目名稱,然后選擇“管理NuGet程序包”選項(xiàng)。
2. 安裝Entity Framework
在NuGet包管理器中,搜索“EntityFramework”,然后選擇“安裝”按鈕以安裝Entity Framework。安裝完成后,Entity Framework將出現(xiàn)在項(xiàng)目引用中。
3. 創(chuàng)建數(shù)據(jù)庫(kù)上下文類
接下來(lái),需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)上下文類,以便使用Entity Framework訪問(wèn)數(shù)據(jù)庫(kù)。在Visual Studio中,右鍵單擊項(xiàng)目名稱,然后選擇“添加” -> “新建項(xiàng)” -> “類”。為類命名,并將其保存在項(xiàng)目的根目錄中。
using System.Data.Entity;
namespace ConsoleApp1
{
public class MyDbContext : DbContext
{
public DbSet YourDatabaseObjects { get; set; }
}
}
上述代碼中,MyDbContext類是從DbContext類繼承而來(lái)的。DbSet是Entity Framework的對(duì)象,用于訪問(wèn)數(shù)據(jù)庫(kù)中的對(duì)象(表)。
4. 連接數(shù)據(jù)庫(kù)
在上一步創(chuàng)建的MyDbContext類中,需要設(shè)置數(shù)據(jù)庫(kù)連接字符串。在App.config或Web.config文件中,找到標(biāo)記,并添加一個(gè)標(biāo)記。在標(biāo)記中,設(shè)置數(shù)據(jù)庫(kù)連接字符串。例如:
上述代碼中,Data Source表示服務(wù)器名稱,Initial Catalog表示數(shù)據(jù)庫(kù)名稱,Integrated Security為True表示使用Windows身份驗(yàn)證方式登錄。
5. 測(cè)試訪問(wèn)數(shù)據(jù)庫(kù)
現(xiàn)在,可以使用MyDbContext類訪問(wèn)數(shù)據(jù)庫(kù)。在Mn方法中,創(chuàng)建MyDbContext對(duì)象,并使用DbSet訪問(wèn)數(shù)據(jù)庫(kù)中的對(duì)象。例如:
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Mn(string[] args)
{
using (var db = new MyDbContext())
{
var yourDatabaseObjects = db.YourDatabaseObjects.ToList();
foreach (var yourDatabaseObject in yourDatabaseObjects)
{
Console.WriteLine(yourDatabaseObject);
}
}
}
}
}
運(yùn)行項(xiàng)目,可以看到數(shù)據(jù)庫(kù)中的對(duì)象被輸出到控制臺(tái)上?,F(xiàn)在,已經(jīng)成功創(chuàng)建了一個(gè)能夠訪問(wèn)數(shù)據(jù)庫(kù)的項(xiàng)目。
如果需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),可以在MyDbContext類中添加多個(gè)DbSet。如果需要更加復(fù)雜的查詢,可以使用LINQ語(yǔ)句來(lái)查詢數(shù)據(jù)庫(kù)中的對(duì)象。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
怎么創(chuàng)建數(shù)據(jù)庫(kù)
問(wèn)題一:創(chuàng)建數(shù)據(jù)庫(kù)的兩種方法 交互式創(chuàng)建,就是你右擊數(shù)據(jù)庫(kù)然后選擇新建數(shù)據(jù)庫(kù)按鈕就可以…..還有一種就是sql語(yǔ)句創(chuàng)建比如創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)名為a 的數(shù)據(jù)庫(kù),那么sql語(yǔ)句就是,create database a;然后執(zhí)行下就可以…
問(wèn)題二:如何用MySQL建立數(shù)據(jù)庫(kù) 這很簡(jiǎn)單?。?
在Windows下,假如你的MySQL裝在 D:\MySQL
就可以這樣:
先切換到它的bin目錄
cd D:\MySQL\bin\
撫:\MySQL\bin>mysql -u root -p
接著輸入你的root密碼
接下來(lái)你就可以創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建用戶、創(chuàng)建修改表之類的操作(常用命令如下)。
查看現(xiàn)有數(shù)據(jù)庫(kù)
mysql> show databases;
創(chuàng)建數(shù)據(jù)庫(kù)(假如數(shù)據(jù)庫(kù)名為 mydb)
mysql> create database mydb;
刪除數(shù)據(jù)庫(kù)(假如數(shù)據(jù)庫(kù)名為 mydb)
mysql> drop database accounts;
使用數(shù)據(jù)庫(kù)(假如使用數(shù)據(jù)庫(kù) mydb)
mysql> use mydb;
執(zhí)行完使用數(shù)據(jù)庫(kù)命令后,就可以對(duì)該數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建、修改、插入、刪除表等操作,這些表的操作命令你可以到網(wǎng)上局旦找找,不是很難的。一個(gè)數(shù)據(jù)庫(kù)就相當(dāng)于一個(gè) Excel 文件,而表則相當(dāng)于Excel文件的單元格,數(shù)據(jù)就是存放在表中。
問(wèn)題三:怎樣建立一個(gè)簡(jiǎn)單數(shù)據(jù)庫(kù)? 把excel導(dǎo)入數(shù)據(jù)庫(kù),不出現(xiàn)表格嵌套可以使用下面這個(gè)方法導(dǎo)入;
思路:
(1)、把excel數(shù)據(jù)讀入到dataset中;
(2)、建立相應(yīng)結(jié)構(gòu)的數(shù)據(jù)表格
(3)、把dat暢set中的數(shù)據(jù)更新到數(shù)據(jù)表中
問(wèn)題四:如何用數(shù)據(jù)庫(kù)向?qū)?chuàng)建數(shù)據(jù)庫(kù) Microsoft Access 提供了三種方法來(lái)創(chuàng)建 Access 數(shù)據(jù)庫(kù) (Microsoft Access 數(shù)據(jù)庫(kù):數(shù)據(jù)和對(duì)象(如表、查詢或窗體)組成的,與特定的主題或用途有關(guān)。)。
可以使用“數(shù)據(jù)庫(kù)向?qū)А眮?lái)創(chuàng)建數(shù)據(jù)庫(kù)。通過(guò)該向?qū)Э梢詮膬?nèi)置模板中進(jìn)行選擇,然后對(duì)其進(jìn)行一定程度的自定義。隨后,該向?qū)?huì)為數(shù)據(jù)庫(kù)創(chuàng)建一組表、查詢、窗體和報(bào)表,同時(shí)還會(huì)創(chuàng)建切換面板。表中不含任何數(shù)據(jù)。如果內(nèi)置模板中的某個(gè)模板非常符合您的要求,請(qǐng)使用該方法。
使用“數(shù)據(jù)庫(kù)向?qū)А眲?chuàng)建數(shù)據(jù)庫(kù)
利用簡(jiǎn)鎮(zhèn)“數(shù)據(jù)庫(kù)向?qū)А?,用一步操作即可為所選數(shù)據(jù)庫(kù)類型創(chuàng)建必需的表、窗體和報(bào)表。這是創(chuàng)建數(shù)據(jù)庫(kù)的最簡(jiǎn)單方法。該向?qū)峁┝擞邢薜倪x項(xiàng)來(lái)自定義數(shù)據(jù)庫(kù)。
單擊工具欄上的“新建”。
在“新建文件”任務(wù)窗格中,在“模板”下,單擊“本機(jī)上的模板”。
在“數(shù)據(jù)庫(kù)”選項(xiàng)卡上,單擊要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)類型的圖標(biāo),然后單擊“確定”。
在“文件新建數(shù)據(jù)庫(kù)”對(duì)話框中,指定數(shù)據(jù)庫(kù)的名稱和位置,然后單擊“創(chuàng)建”。
按照“數(shù)據(jù)庫(kù)向?qū)А钡闹笇?dǎo)進(jìn)行操作。
如果向?qū)磫?dòng)
這可能是因?yàn)?Access 正運(yùn)行于沙盒模式,但您的計(jì)算機(jī)上尚未安裝 Microsoft Jet 4.0 SP8 或更高版本。啟用沙盒模式后,必須安裝有 Jet 4.0 SP8 或更高版本,Access 才能完全發(fā)揮作用。
有關(guān)安裝 Jet 升級(jí)的詳細(xì)信息,請(qǐng)參閱 Office Online 文章關(guān)于 Microsoft Jet 4.0 SP8 或更高版本。
有關(guān)沙盒模式的詳細(xì)信息,請(qǐng)參閱 Office Online 文章關(guān)于 Microsoft Jet Expression Service 沙盒模式。
注釋 不能使用“數(shù)據(jù)庫(kù)向?qū)А毕蛞延械臄?shù)據(jù)庫(kù)中添加新的表、窗體或報(bào)表。
如果正在使用 Access 2023,可以在 中搜索 Access 模板。下載模板是創(chuàng)建數(shù)據(jù)庫(kù)的最快方式。如果您找到了非常符合要求的模板,請(qǐng)使用該方法。模板是一個(gè)包含表、查詢、窗體和報(bào)表的 Access 數(shù)據(jù)庫(kù)文件 (*.mdb)。表中不含任何數(shù)據(jù)。打開(kāi)數(shù)據(jù)庫(kù)后,可以自定義數(shù)據(jù)庫(kù)和對(duì)象。
使用模板創(chuàng)建數(shù)據(jù)庫(kù)
這是創(chuàng)建數(shù)據(jù)庫(kù)的最快方式。如果能找到并使用與您的要求非常接近的模板,則此方法效果更佳。
在工具欄上單擊“新建”。
在“新建文件”任務(wù)窗格中,在“模板”下,搜索特定的模板,或單擊“Office Online 模攔臘粗板”找到合適的模板。
找到需要的 Access 模板,然后單擊“下載”。
如果要基于自己的設(shè)計(jì)創(chuàng)建數(shù)據(jù)庫(kù),請(qǐng)先創(chuàng)建一個(gè)空數(shù)據(jù)庫(kù),然后再分別添加表、窗體、報(bào)表及其他對(duì)象。這是最靈活的方法,但需要分別定義每一個(gè)數(shù)據(jù)庫(kù)元素。
不使用“數(shù)據(jù)庫(kù)向?qū)А眲?chuàng)建空數(shù)據(jù)庫(kù)
單擊工具欄上的“新建”。
在“新建文件”任務(wù)窗格中的“新建”下,單擊“空數(shù)據(jù)庫(kù)”。
在“文件新建數(shù)據(jù)庫(kù)”對(duì)話框中,指定數(shù)據(jù)庫(kù)的名稱和位置,然后單擊“創(chuàng)建”。
然后將出現(xiàn)“數(shù)據(jù)庫(kù)”窗口 (數(shù)據(jù)庫(kù)窗口:在打開(kāi) Access 數(shù)據(jù)庫(kù)或 Access 項(xiàng)目時(shí)出現(xiàn)的窗口。它顯示用于新建數(shù)據(jù)庫(kù)對(duì)象和打開(kāi)現(xiàn)有對(duì)象的快捷方式。),現(xiàn)在便可以在數(shù)據(jù)庫(kù)中創(chuàng)建所需的對(duì)象 (數(shù)據(jù)庫(kù)對(duì)象:Access 數(shù)據(jù)庫(kù)包含諸如表、查詢、窗體、報(bào)表、頁(yè)、宏和模塊等對(duì)象;Access 項(xiàng)目包含諸如窗體、報(bào)表、頁(yè)、宏和模塊等對(duì)象。)?!?>
問(wèn)題五:怎樣在mysql中創(chuàng)建數(shù)據(jù)庫(kù) 是這句:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)MYSQLDATA
mysql> CREATE DATABASE MYSQLDATA;
基本操作:MySQL中新建用戶,新建數(shù)據(jù)庫(kù),用戶授權(quán),刪除用戶,修改密碼的相關(guān)操作測(cè)試環(huán)境:WIN32 mysql5.0.45注:本操作是在WIN命令提示符下,phpMyAdmin同樣適用。
用戶:phplamp 用戶數(shù)據(jù)庫(kù):phplampDB1.新建用戶。登錄MYSQL
@>mysql -u root -p
@>密碼
創(chuàng)建用戶
mysql> insert into mysql.user(Host,User,Password) values(localhost,phplamp,password(1234));
刷新系統(tǒng)權(quán)限表
mysql>flush privileges;
這樣就創(chuàng)建了一個(gè)名為:phplamp 密碼為:1234 的用戶。然后登錄一下。mysql>exit;
@>mysql -u phplamp -p
@>輸入密碼
mysql>登錄成功2.為用戶授權(quán)。登錄MYSQL(有ROOT權(quán)限)。我里我以ROOT身份登錄.
@>mysql -u root -p
@>密碼
首先為用戶創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)(phplampDB)
mysql>create database phplampDB;
授權(quán)phplamp用戶擁有phplamp數(shù)據(jù)庫(kù)的所有權(quán)限。
>grant all privileges on phplampDB.* to identified by ‘1234’;
刷新系統(tǒng)權(quán)限表
mysql>flush privileges;
mysql>其它操作/*
如果想指定部分權(quán)限給一用戶,可以這樣來(lái)寫(xiě):
mysql>grant select,update on phplampDB.* to identified by ‘1234’;
刷新系統(tǒng)權(quán)限表。
mysql>flush privileges;
*/3.刪除用戶。@>mysql -u root -p
@>密碼
mysql>DELETE FROM user WHERE User=phplamp and Host=localhost;
mysql>flush privileges;
刪除用戶的數(shù)據(jù)庫(kù)
mysql>drop database phplampDB;4.修改指定用戶密碼。@>mysql -u root -p
@>密碼
mysql>update mysql.user set password=password(‘新密碼’) where User=phplamp and Host=localhost;
mysql>flush privileges;5.列出所有數(shù)據(jù)庫(kù)mysql>show database;6.切換數(shù)據(jù)庫(kù)mysql>use ‘?dāng)?shù)據(jù)庫(kù)名’;7.列出所有表mysql>show t……>>
問(wèn)題六:怎么創(chuàng)建數(shù)據(jù)庫(kù)連接 方法一、通過(guò)編寫(xiě)代碼來(lái)連接數(shù)據(jù)庫(kù)
1定義連接字符串。Data Source=服務(wù)器;Initial Catalog=數(shù)據(jù)庫(kù)名;User ID=用戶名;Pwd=密碼 如:Data Source=IDEA-PC\SQLEXPRESS;Initial Catalog=student;User ID=sa;
2創(chuàng)建Connection對(duì)象。 SqlConnection sqlconnection1=new SqlConnection(constring);
constring為連接字符串。
3打開(kāi)與數(shù)據(jù)庫(kù)的鏈接。 Sqlconnection1.Open();
4這時(shí)數(shù)據(jù)庫(kù)就連接成功,可以操作數(shù)據(jù)庫(kù)了。
方法二、通過(guò)拖拽形式建立數(shù)據(jù)庫(kù)連接
1打開(kāi)視圖–>服務(wù)器資源管理器。
2右鍵點(diǎn)就數(shù)據(jù)連接,選擇添加連接。
3選擇服務(wù)器名(先刷新一下)–>登陸到服務(wù)器身份驗(yàn)證形式–>選擇一個(gè)數(shù)據(jù)庫(kù)名–>測(cè)試鏈接–>確定(如果測(cè)試鏈接成功的話)。
4這是建立數(shù)據(jù)庫(kù)連接就成功了,可以使用了。
問(wèn)題七:sqlserver 下怎么建立數(shù)據(jù)庫(kù) 怎么建表 方法/步驟
1
首先我們打開(kāi)SQL SERVER自帶的數(shù)據(jù)庫(kù)管理工具,從開(kāi)始菜單中可以找到,如圖點(diǎn)擊進(jìn)去;
2
開(kāi)始連接SQL SERVER服務(wù)器,就是我們裝好的SQL SERVER 服務(wù)器;
3
右擊數(shù)據(jù)庫(kù),選擇之一個(gè),新建一個(gè)數(shù)據(jù)庫(kù);
4
填寫(xiě)數(shù)據(jù)庫(kù)的名稱,下面是設(shè)置自動(dòng)增長(zhǎng)的,一般不用管,默認(rèn)
5
點(diǎn)擊確定后就可以生成一個(gè)數(shù)據(jù)庫(kù),此時(shí)里面是沒(méi)有表的;
6
右擊表新建一個(gè)表,填寫(xiě)你要的字段名稱
7
填完字段名稱后點(diǎn)擊字段名稱那個(gè)內(nèi)部窗口的小叉叉,然后就提示你輸入表名了,填寫(xiě)下表名,一個(gè)數(shù)據(jù)庫(kù)的建立過(guò)程就是這樣的;
或者
create database stuDB
on primary — 默認(rèn)就屬于primary文件組,可省略
(
/*–數(shù)據(jù)文件的具體描述–*/
name=’stuDB_data’, — 主數(shù)據(jù)文件的邏輯名稱
filename=’D:\stuDB_data.mdf’, — 主數(shù)據(jù)文件的物理名稱
size=5mb, –主數(shù)據(jù)文件的初始大小
maxsize=100mb, — 主數(shù)據(jù)文件增長(zhǎng)的更大值
filegrowth=15%–主數(shù)據(jù)文件的增長(zhǎng)率
)
log on
(
/*–日志文件的具體描述,各參數(shù)含義同上–*/
name=’stuDB_log’,
filename=’D:\stuDB_log.ldf’,
size=2mb,
filegrowth=1mb
)
問(wèn)題八:oracle數(shù)據(jù)庫(kù)怎么創(chuàng)建新用戶? 在CRT中進(jìn)入oracle –連接sqlplus
按照下面寫(xiě)完代碼直接復(fù)制進(jìn)去回車就行了
—建立用戶代碼為:CREATE USER 用戶名字 PROFILE DEFAULT IDENTIFIED BY 密碼 DEFAULT TABLESPACE 指定表空間名字 TEMPORARY TABLESPACE 臨時(shí)表空間 ACCOUNT UNLOCK;
—賦權(quán)
begin
EXECUTE IMMEDIATE ‘GRA?T SELECT ANY DICTIONARY TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT ALTER ANY TABLE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT ALTER SYSTEM TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT ALTER ANY PROCEDURE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CONNECT TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE ANY PROCEDURE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE ANY TABLE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE ANY INDEX TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE DATABASE LINK TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE PUBLIC DATABASE LINK TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE ANY VIEW TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE PUBLIC SYNONYM TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT CREATE TABLE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DELETE ANY TABLE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP PUBLIC DATABASE LINK TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP ANY TRIGGER TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP ANY INDEX TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP ANY PROCEDURE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP ANY TABLE TO 用戶名’;
EXECUTE IMMEDIATE ‘GRANT DROP ANY VIEW TO 用戶名’;
……>>
問(wèn)題九:如何創(chuàng)建數(shù)據(jù)庫(kù) 1、通過(guò)向?qū)Ы⒑褪褂脭?shù)據(jù)庫(kù)
之一步:選擇服務(wù)視圖,然后展開(kāi)DataBase(數(shù)據(jù)庫(kù)節(jié)點(diǎn)),右鍵點(diǎn)擊JavaDB
啟動(dòng)服務(wù)器
2、在右鍵單擊JavaDB,選擇創(chuàng)建數(shù)據(jù)庫(kù)
3、在彈出的對(duì)話框中填寫(xiě)相應(yīng)的名稱,寫(xiě)完后點(diǎn)擊確定完成的數(shù)據(jù)的創(chuàng)建。
如何搭建.NET Entity Framework分布式應(yīng)用系統(tǒng)框架
至.net FrameWork 3.5 sp1時(shí),才推出Entity FrameWork,可以通過(guò)實(shí)現(xiàn)不同的Provider來(lái)支持不同的數(shù)據(jù)庫(kù)(當(dāng)然微軟還是只內(nèi)置SQL Server的Provider,其它數(shù)據(jù)庫(kù)的Provider么,需要第三方開(kāi)發(fā))。EF加上linq,這是.net開(kāi)發(fā)上的一個(gè)巨大進(jìn)步,.net程序員以對(duì)象方式操作數(shù)據(jù),以類sql語(yǔ)法在程序里查詢數(shù)據(jù),大大減少了繁瑣的構(gòu)造SQL語(yǔ)句的工作,可以更加專注于編寫(xiě)業(yè)務(wù)邏輯代碼。但是在多層架構(gòu)的分布式應(yīng)用系統(tǒng)中,實(shí)體對(duì)象通過(guò)遠(yuǎn)程序列化到客戶端時(shí),這些實(shí)體會(huì)與其數(shù)據(jù)上下文(也就是實(shí)體容器)分離,在客戶端無(wú)法對(duì)實(shí)體直接進(jìn)行查詢以及CUD(Create,Update,Delete)操作,下面以SQL Server為數(shù)據(jù)庫(kù),Remoting+Entity Framework3.5作為數(shù)據(jù)服務(wù)層,WinForm作為客戶端,講述一下如何使用EF框架搭建多層分布式應(yīng)用系統(tǒng)。 二、 技術(shù)分析 1. 通過(guò)遠(yuǎn)程客戶端傳輸過(guò)來(lái)的實(shí)體,都是處于分離狀態(tài)(EntityState屬性值為Detached),所以在多層應(yīng)用程序中的服務(wù)端實(shí)現(xiàn)實(shí)體的更新或刪除時(shí),關(guān)鍵是如何把實(shí)體附加回實(shí)體容器中。MSDN上關(guān)于對(duì)分離實(shí)體的查詢和CUD操作描述如下: 1) 附加對(duì)象(實(shí)體框架) 在實(shí)體框架的某個(gè)對(duì)象上下文內(nèi)執(zhí)行查詢時(shí),返回的對(duì)象會(huì)自動(dòng)附加到該對(duì)象上下文。困老還可以將從源而不是從查詢獲得的對(duì)象附加到對(duì)象上下文。您可以附加以前分離的對(duì)象、由 NoTracking 查詢返回的對(duì)象或從對(duì)象上下文的外部獲取的對(duì)象。還可以附加存儲(chǔ)在 ASP.NET 應(yīng)用程序的視圖狀態(tài)中的對(duì)象或從遠(yuǎn)程方法調(diào)用或 Web 服務(wù)返回的對(duì)象。 使用下列方法之一將對(duì)象附加到對(duì)象上下文: · 調(diào)用 ObjectContext 上的 AddObject 將對(duì)象附加到對(duì)象上下文。當(dāng)對(duì)象為數(shù)據(jù)源中尚不存在的新對(duì)象時(shí)采用此方法。 · 調(diào)用 ObjectContext上的Attach 將對(duì)象附加到對(duì)象上下文。當(dāng)對(duì)象已存在于數(shù)據(jù)源中但當(dāng)前尚未附加到上下歲尺納文時(shí)采用此方法。有關(guān)更多信息,請(qǐng)參見(jiàn)如何:附加相關(guān)對(duì)象(實(shí)體乎沒(méi)框架)。 · 調(diào)用 ObjectContext的AttachTo,以將對(duì)象附加到對(duì)象上下文中的特定實(shí)體集。如果對(duì)象具有 null(在 Visual Basic 中為 Nothing)EntityKey 值,也可以執(zhí)行此操作。 · 調(diào)用 ObjectContext上的ApplyPropertyChanges。當(dāng)對(duì)象已存在于數(shù)據(jù)源中,并且分離的對(duì)象具有您希望保存的屬性更新時(shí)采用此方法。如果簡(jiǎn)單地附加該對(duì)象,則屬性更改將丟失。有關(guān)更多信息,請(qǐng)參見(jiàn)如何:應(yīng)用對(duì)已分離對(duì)象的更改(實(shí)體框架)。 2) 應(yīng)用對(duì)已分離對(duì)象的更改(實(shí)體框架)示例代碼 View Code2. 實(shí)現(xiàn)動(dòng)態(tài)條件查詢。在本地環(huán)境中,對(duì)于Linq,我們可以通過(guò)動(dòng)態(tài)構(gòu)造Lambda表達(dá)式樹(shù)來(lái)實(shí)現(xiàn)動(dòng)態(tài)條件查詢,但是在遠(yuǎn)程環(huán)境中,Lamdba表達(dá)式不支持遠(yuǎn)程序列化傳輸,只能通過(guò)ObjectContext的CreateQuery方法實(shí)現(xiàn),但幸好微軟后來(lái)又提供了一個(gè)LINQ動(dòng)態(tài)查詢擴(kuò)展庫(kù)Dynamic.cs,使用起來(lái)更方便,于是采用它實(shí)現(xiàn)。 3. EF中核心抽象類是ObjectContext,實(shí)體容器都從它派生,實(shí)體容器上的CUD方法其實(shí)都是通過(guò)調(diào)用ObjectContext的CUD操作方法實(shí)現(xiàn)的。1) AddObject(string,object):表示添加實(shí)體object到實(shí)體容器,只要實(shí)體的EntityKey值為空,無(wú)論是否Detached狀態(tài)均可以通過(guò)此方法實(shí)現(xiàn)添加操作。2) ApplyPropertyChanges(string,object)表示把分離狀態(tài)的實(shí)體object上的所作的修改更新回容器中已存在的對(duì)應(yīng)的實(shí)體,執(zhí)行條件有兩個(gè):①實(shí)體處于分離狀態(tài),②實(shí)體容器中存在主鍵值與其相同的且為Unchanged狀態(tài)的實(shí)體,所以,當(dāng)我們需要更新一個(gè)Detached狀態(tài)的實(shí)體時(shí),可以先把一個(gè)具有原始值的相同鍵值的實(shí)體附加回容器中,或者直接執(zhí)行一下查詢,從數(shù)據(jù)庫(kù)中取出該實(shí)體。3) DeleteObject(object)表示從實(shí)體容器中刪除一個(gè)實(shí)體,執(zhí)行條件是該實(shí)體存在于實(shí)體容器中,所以刪除一個(gè)Detach狀態(tài)的實(shí)體之前,需要把它通過(guò)Attach方法附加回實(shí)體容器中。 4. 實(shí)體對(duì)象也是基于抽象類EntityObject派生的,由此我們完全可以用ContextObject和EntityObject實(shí)現(xiàn)服務(wù)端對(duì)實(shí)體的查詢和CUD方法,其實(shí)現(xiàn)子類在運(yùn)行時(shí)由客戶端注入,從而使服務(wù)端和數(shù)據(jù)庫(kù)實(shí)現(xiàn)松耦合。 5. 下圖是MSDN上關(guān)于在數(shù)據(jù)訪問(wèn)層中使用 LINQ to SQL 的 n 層應(yīng)用程序的基本體系結(jié)構(gòu)圖,其實(shí)EF的結(jié)構(gòu)也是一樣的,不過(guò)是把DataContext換成ObjectContext。三、 動(dòng)手開(kāi)發(fā) 1. 利用EF建立數(shù)據(jù)庫(kù)概念模型新建一個(gè)解決方案EFServiceSystem,添加一個(gè)新項(xiàng)目,命名為EFModel,添加項(xiàng)目,在項(xiàng)目下添加一個(gè)ADO.NET Entity Data Model項(xiàng),命名為EFModel.edmx,選擇從數(shù)據(jù)庫(kù)生成(假設(shè)我們已經(jīng)建好了一個(gè)SQL Server數(shù)據(jù)庫(kù)),一路點(diǎn)擊下一步,直至完成。編譯項(xiàng)目成功后就算完成。為什么要把數(shù)據(jù)庫(kù)模型單獨(dú)編譯成一個(gè)dll呢,我將在后面給予解釋。 2. 建立數(shù)據(jù)服務(wù)層在解決方案下再添加一個(gè)類庫(kù)項(xiàng)目,命名為EFService。1) 利用外觀模式,我們把客戶端常用的查詢和CUD操作方法簡(jiǎn)化為3個(gè)方法Query,Save(T t),Delete(T t),根據(jù)針對(duì)接口編程的設(shè)計(jì)原則,定義一個(gè)CUD方法接口供客戶端調(diào)用。 View Code2) 實(shí)現(xiàn)類EntityHelper的代碼。主要思路是通過(guò)構(gòu)造函數(shù)注入數(shù)據(jù)上下文實(shí)例名稱,在配置文件取出其程序集限定名,通過(guò)反射創(chuàng)建實(shí)例,調(diào)用實(shí)例的相應(yīng)方法實(shí)現(xiàn)接口。 View Code3) 最后,我們創(chuàng)建一個(gè)服務(wù)工廠類,暴露給客戶端,負(fù)責(zé)以接口方式向客戶端提供遠(yuǎn)程服務(wù)對(duì)象,數(shù)據(jù)服務(wù)層創(chuàng)建完畢。 View Code4) 補(bǔ)充一下Dynamic.cs的內(nèi)容,省得你去網(wǎng)上找了View Code3. 創(chuàng)建運(yùn)行服務(wù)的宿主程序。實(shí)際開(kāi)發(fā)中,通常選擇創(chuàng)建一個(gè)windows服務(wù)程序來(lái)運(yùn)行Remoting,但是服務(wù)需要安裝才能啟動(dòng),運(yùn)行和調(diào)試起來(lái)都比較繁瑣,所以這里創(chuàng)建一個(gè)簡(jiǎn)單的控制臺(tái)程序來(lái)運(yùn)行它。在解決方案下添加一個(gè)控制臺(tái)程序項(xiàng)目,在program.cs編寫(xiě)如下代碼: View Code配置文件App.Config主要包括數(shù)據(jù)庫(kù)連接信息以及自己定義一個(gè)數(shù)據(jù)上下文名稱(這里和數(shù)據(jù)庫(kù)連接名稱相同,事實(shí)上不必相同),數(shù)據(jù)庫(kù)連接信息可以從EFModel項(xiàng)目中配置文件中直接拷貝過(guò)來(lái)。內(nèi)容如下: View Code編譯成功后,拷貝EFModel和和EFService兩個(gè)項(xiàng)目生成的dll文件至可執(zhí)行文件EFServiceHost.exe同一目錄下,點(diǎn)擊運(yùn)行EFServiceHost.exe。 4. 最后,我們建立一個(gè)winform客戶端作為測(cè)試。在program.cs注冊(cè)遠(yuǎn)程服務(wù): View Code四、 部署應(yīng)用 1. 至此,整個(gè)系統(tǒng)搭建完畢。在本例中,我把所有項(xiàng)目都統(tǒng)一建立在一個(gè)解決方案下,其實(shí)是為了演示方便,實(shí)際開(kāi)發(fā)時(shí)候,完全可以各自獨(dú)立創(chuàng)建。下面我們來(lái)分析一下各個(gè)項(xiàng)目的職能和相互之間的引用關(guān)系。 1) EFModel:由Visual Studio 的數(shù)據(jù)模型工具生成的數(shù)據(jù)庫(kù)實(shí)例模型,提供數(shù)據(jù)的查詢以及CUD操作。不需引用其它項(xiàng)目。 2) EFService:使用數(shù)據(jù)庫(kù)實(shí)例模型以及實(shí)體的抽象基類編寫(xiě)完成,代碼里不涉及具體數(shù)據(jù)庫(kù)模型實(shí)例,運(yùn)行時(shí)通過(guò)客戶端注入?yún)?shù)和讀取配置文件動(dòng)態(tài)生成數(shù)據(jù)庫(kù)模型實(shí)例,并調(diào)用實(shí)例的查詢和CUD方法實(shí)現(xiàn)客戶端的請(qǐng)求。不需引用其它項(xiàng)目。 3) EFServiceHost:負(fù)責(zé)運(yùn)行Remoting服務(wù),如果通過(guò)配置文件方式發(fā)布服務(wù)的話,編譯時(shí)也不需引用其它項(xiàng)目,我這里引用了EFService項(xiàng)目,是因?yàn)槭褂昧舜a方式暴露EFSservice的服務(wù)類。運(yùn)行時(shí)需要將EFService和EFModel的dll文件拷貝至運(yùn)行目錄下。 4) EFClient:需要引用EFModel和EFService。(注:因?yàn)楸纠惺绞褂昧薘emoting作為遠(yuǎn)程服務(wù),如果是WebService或者WCF則只需添加服務(wù)引用,然后在本地生成客戶端代理類)。事實(shí)上EFService中的實(shí)現(xiàn)類EntityHelper也可以獨(dú)立出去,不必讓客戶端引用,對(duì)于客戶端而言,僅僅是使用ServiceFactory和接口IentityHelper就足夠了。這樣只要接口不變,EntityHelper更新的時(shí)候,客戶端無(wú)須更新引用,而且服務(wù)端代碼可以完全被隔離開(kāi)客戶端,對(duì)一些服務(wù)端和客戶端之間的保密性比較敏感的項(xiàng)目尤為有利。 2. 通過(guò)分析我們發(fā)現(xiàn),在開(kāi)發(fā)下一個(gè)新項(xiàng)目的時(shí)候,即使整個(gè)數(shù)據(jù)庫(kù)都變了,從SQL SERVER變成Oracle,數(shù)據(jù)庫(kù)服務(wù)名變了,表也變了,我們?nèi)匀粺o(wú)需修改服務(wù)端代碼,只需針對(duì)新的數(shù)據(jù)庫(kù),生成新的EFModel,然后拷貝DLL文件至EFServiceHost的運(yùn)行目錄下(這也就是我為什么要把EFModel獨(dú)立成一個(gè)項(xiàng)目的原因),再修改一下EFServiceHost的配置文件中的數(shù)據(jù)庫(kù)連接和實(shí)體容器名稱即可完成新系統(tǒng)的部署。對(duì)于客戶端來(lái)說(shuō),也就是更新一下EFModel.dll,還是調(diào)用服務(wù)端提供的那幾個(gè)API,便可完成查詢和CUD操作,不用關(guān)心底層的數(shù)據(jù)庫(kù)是SQL Server還是Oracle,更不用自己實(shí)現(xiàn)對(duì)新庫(kù)新表的查詢和CUD操作(本來(lái)也不用)。當(dāng)然,對(duì)于正在運(yùn)行的系統(tǒng),我們也可以針對(duì)新建數(shù)據(jù)庫(kù)生成新的實(shí)體模型DLL,拷貝至EFServiceHost運(yùn)行目錄下,實(shí)現(xiàn)熱插拔方式擴(kuò)展數(shù)據(jù)庫(kù),而對(duì)原來(lái)的系統(tǒng)毫無(wú)影響,即使新加的庫(kù)是不同類型的庫(kù)。 五、 系統(tǒng)架構(gòu)圖示 六、 總結(jié) 從以上分析可以看出,該系統(tǒng)運(yùn)用到項(xiàng)目開(kāi)發(fā)中,對(duì)服務(wù)端來(lái)說(shuō),實(shí)現(xiàn)了更大程度組件重用(零代碼修改),對(duì)客戶端開(kāi)發(fā)來(lái)說(shuō),高度簡(jiǎn)化了對(duì)數(shù)據(jù)的操作命令,并封裝了實(shí)現(xiàn)細(xì)節(jié),大大降低了開(kāi)發(fā)的技術(shù)難度,提高了開(kāi)發(fā)速度。當(dāng)然,我這里寫(xiě)的代碼僅僅是最簡(jiǎn)單的演示代碼,在實(shí)際項(xiàng)目開(kāi)發(fā)中,服務(wù)端要處理的細(xì)節(jié)和擴(kuò)展的功能要比這復(fù)雜得多。比如性能優(yōu)化,實(shí)現(xiàn)復(fù)雜查詢和批量CUD操作,并發(fā)處理,事務(wù)控制,日志跟蹤,數(shù)據(jù)緩存等等。另外,如果各層采用不同的技術(shù)實(shí)現(xiàn),服務(wù)層實(shí)現(xiàn)的代碼也有差異。比如EF可以選擇最新版的更完善更強(qiáng)大的EF4.0,遠(yuǎn)程服務(wù)可以選擇Remoting,WebService,WCF等,不同的遠(yuǎn)程服務(wù),宿主程序也有所不同,Remoting和WCF可以選擇winform,控制臺(tái)程序,IIS,而Web Service只能選擇IIS。不同的服務(wù),不同的宿主程序,會(huì)有不同的通信通道 (Http,Tcp),不同的數(shù)據(jù)傳輸格式 (二進(jìn)制,XML,ON)。如果你嫌上面的實(shí)現(xiàn)方式涉及的技術(shù)太多,開(kāi)發(fā)起來(lái)太麻煩,那么,微軟現(xiàn)成的具有REST風(fēng)格的遠(yuǎn)程數(shù)據(jù)服務(wù)WCF Data Services會(huì)是你的更佳選擇。
.net新建數(shù)據(jù)庫(kù)上下文類的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于.net新建數(shù)據(jù)庫(kù)上下文類,快速創(chuàng)建數(shù)據(jù)庫(kù)上下文類——.NET指南,怎么創(chuàng)建數(shù)據(jù)庫(kù),如何搭建.NET Entity Framework分布式應(yīng)用系統(tǒng)框架的信息別忘了在本站進(jìn)行查找喔。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)、開(kāi)啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長(zhǎng),共創(chuàng)價(jià)值。
新聞名稱:快速創(chuàng)建數(shù)據(jù)庫(kù)上下文類——.NET指南(.net新建數(shù)據(jù)庫(kù)上下文類)
轉(zhuǎn)載來(lái)于:http://m.fisionsoft.com.cn/article/ccosoie.html


咨詢
建站咨詢
