新聞中心
在企業(yè)級(jí)應(yīng)用中,數(shù)據(jù)的更新是一個(gè)至關(guān)重要且必不可少的操作。Entity Framework(EF)框架作為一個(gè)強(qiáng)大的ORM框架,為我們提供了很多便利。本文將介紹EF框架的數(shù)據(jù)庫(kù)更新,幫助大家更好地應(yīng)用EF框架!

創(chuàng)新互聯(lián)主營(yíng)錦屏網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶App定制開(kāi)發(fā),錦屏h5小程序定制開(kāi)發(fā)搭建,錦屏網(wǎng)站營(yíng)銷(xiāo)推廣歡迎錦屏等地區(qū)企業(yè)咨詢
一、EF更新原理
EF更新實(shí)際上是基于EF的Change Tracking機(jī)制。當(dāng)我們修改了數(shù)據(jù)實(shí)體的屬性值之后,EF會(huì)自動(dòng)將這些修改的內(nèi)容保存起來(lái),然后等我們調(diào)用SaveChanges方法時(shí)一次性提交,將這些修改保存到數(shù)據(jù)庫(kù)中。
二、常用更新方法
1.Update方法
Update方法是最常用的更新方法,它的工作原理是先將數(shù)據(jù)實(shí)體查詢出來(lái),再將修改后的屬性重新賦值,最后調(diào)用SaveChanges方法保存修改。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = context.Users.Find(1);
user.Name = “新的用戶名”;
context.SaveChanges();
}
“`
2.Entry方法
Entry方法是EF框架中基于Change Tracking機(jī)制的擴(kuò)展方法。它可以讓我們直接獲取數(shù)據(jù)實(shí)體的狀態(tài),方便我們進(jìn)行修改和判斷。比如我們可以使用Entry方法獲取到數(shù)據(jù)實(shí)體的狀態(tài),然后根據(jù)狀態(tài)進(jìn)行不同的操作。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = new User {Id = 1, Name = “新的用戶名”};
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
}
“`
3.Attach方法
Attach方法可以將現(xiàn)有的數(shù)據(jù)實(shí)體附加到Entity Framework的上下文中。Attach方法常用于從一個(gè)HTTP POST中恢復(fù)一個(gè)已經(jīng)被刪除的實(shí)體,或者是在自定義數(shù)據(jù)合并代碼中合并來(lái)自多個(gè)源的實(shí)體。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = new User {Id = 1, Name = “新的用戶名”};
context.Entry(users).State = EntityState.Detached;
context.Attach(user);
context.SaveChanges();
}
“`
三、批量更新
EF框架中提供了很多方法進(jìn)行批量更新。下面詳細(xì)介紹三種不同的批量更新方法。
1.使用Sql語(yǔ)句進(jìn)行批量更新
我們可以使用Sql語(yǔ)句進(jìn)行批量更新操作。在EF上下文中獲取Database對(duì)象,然后使用ExecuteSqlCommand方法執(zhí)行相應(yīng)的Sql語(yǔ)句。示例代碼如下:
“`
var sql = “UPDATE [User] SET [Name] = ‘新的用戶名’ WHERE [Id] = 1”;
using (var context = new DbContext())
{
context.Database.ExecuteSqlCommand(sql);
}
“`
2.使用BulkExtensions進(jìn)行批量更新
BulkExtensions是一款開(kāi)源的EF擴(kuò)展庫(kù),它提供了一個(gè)非常方便的批量操作API。我們可以使用BulkExtensions的BulkUpdate方法進(jìn)行批量更新。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = new List
{
new User {Id = 1, Name = “新的用戶名”},
new User {Id = 2, Name = “新的用戶名”}
};
context.BulkUpdate(user);
}
“`
3.使用SqlBulkCopy進(jìn)行批量更新
SqlBulkCopy是SQL Server提供的一種高性能數(shù)據(jù)加載解決方案,可以將大量數(shù)據(jù)快速?gòu)?fù)制到SQL Server表中。我們可以使用SqlBulkCopy將數(shù)據(jù)集中的數(shù)據(jù)批量更新到數(shù)據(jù)庫(kù)中。示例代碼如下:
“`
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = “User”;
var dataTable = new DataTable(“User”);
dataTable.Columns.Add(“Id”, typeof(int));
dataTable.Columns.Add(“Name”, typeof(string));
dataTable.Rows.Add(1, “新的用戶名”);
dataTable.Rows.Add(2, “新的用戶名”);
bulkCopy.WriteToServer(dataTable);
}
}
“`
四、常見(jiàn)的更新問(wèn)題
1.更新時(shí)間的自動(dòng)更新問(wèn)題
在某些場(chǎng)景下,比如我們需要記錄用戶的創(chuàng)建時(shí)間和最后修改時(shí)間等,在修改數(shù)據(jù)實(shí)體時(shí),我們需要保留這些時(shí)間的信息,而不能將這些時(shí)間覆蓋掉。此時(shí),我們可以使用DataAnnotations中的屬性,將更新時(shí)間添加到數(shù)據(jù)表中。示例代碼如下:
“`
public abstract class EntityBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedTime { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime UpdatedTime { get; set; }
}
“`
2.更新實(shí)體關(guān)聯(lián)屬性的問(wèn)題
我們?cè)诟聰?shù)據(jù)實(shí)體時(shí)可能會(huì)修改它的關(guān)聯(lián)屬性,此時(shí)我們需要將關(guān)聯(lián)屬性再次查詢出來(lái)后再進(jìn)行修改操作。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = context.Users.Include(u => u.Roles).Single(u => u.Id == 1);
user.Name = “新的用戶名”;
foreach (var role in user.Roles)
{
role.Name = “新的角色名”;
}
context.SaveChanges();
}
“`
3.更新實(shí)體時(shí)的并發(fā)問(wèn)題
在多線程或分布式系統(tǒng)環(huán)境中,當(dāng)多個(gè)線程或服務(wù)同時(shí)操作同一數(shù)據(jù)實(shí)體時(shí),可能會(huì)發(fā)生并發(fā)問(wèn)題。EF框架提供了EntityState標(biāo)識(shí)和rowversion標(biāo)識(shí)等方法解決并發(fā)問(wèn)題。示例代碼如下:
“`
using (var context = new DbContext())
{
var user = context.Users.Single(u => u.Id == 1);
user.Name = “新的用戶名”;
context.Entry(user).State = EntityState.Modified;
try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var clientValues = (User) entry.Entity;
var databaseValues = (User) entry.GetDatabaseValues().ToObject();
entry.OriginalValues.SetValues(databaseValues);
throw new Exception(“數(shù)據(jù)已被其他人修改,請(qǐng)刷新后再試!”);
}
}
“`
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
EF中的code first模式 怎么創(chuàng)建數(shù)據(jù)庫(kù)
方法/步驟
EF的Code First模式不需要我們創(chuàng)建什么數(shù)據(jù)向?qū)?,直接?xiě)代碼就行了。我們用NET最簡(jiǎn)單的控制臺(tái)應(yīng)用程序來(lái)說(shuō)明。如下圖所示
下面我們新建兩個(gè)實(shí)體,一個(gè)實(shí)體是班級(jí)對(duì)象,一個(gè)實(shí)體是學(xué)生對(duì)象,注意這兩個(gè)對(duì)象是一對(duì)多的關(guān)系,他們的構(gòu)建如下圖所示,注意他們聲明上喊返面的屬性標(biāo)識(shí)
然后我們需要引用兩個(gè)庫(kù),一個(gè)就是我們的EntityFramework,另一個(gè)就是System.Data.Entity
下面就舉旅是主要寫(xiě)EF的上下文對(duì)象了,如下圖所示,需要繼承EF的DbContext。注意base里的名字為連接字符串名字,在App.Config中配置即可。為了說(shuō)明CodeFirst的魅力,這里我填寫(xiě)的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)中并沒(méi)有
下面我們?cè)谥骱瘮?shù)中新增班級(jí)對(duì)象,然后執(zhí)行EF的SaveChanges方法
看一下我們正滲凳的數(shù)據(jù)庫(kù)吧,你會(huì)發(fā)現(xiàn)數(shù)據(jù)庫(kù)中是不是多出來(lái)了一個(gè)我們?cè)谂渲梦募袑?xiě)的數(shù)據(jù)庫(kù)名字,并且也已經(jīng)將表創(chuàng)建好了
通過(guò)以上的步驟,你感覺(jué)到EF的Code First模式的魅力了沒(méi),自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)以及表。這也是現(xiàn)在應(yīng)用最多的模式了,好了,這次分享就到這里。有什么問(wèn)題的話,留言咨詢即可。
微軟EF框架存儲(chǔ)過(guò)程問(wèn)題,VS2023+.NET4.5+EF6.1.1
我用的是5.0沒(méi)這個(gè)問(wèn)題,不過(guò)如果你理解T4模板的話這個(gè)問(wèn)題很好解決。
這個(gè)應(yīng)該是6.0重構(gòu)了一些命名空間后,和VS原有的實(shí)體數(shù)據(jù)模型模板瞎模不一致了。
解決辦法如下:修改灶櫻你的 xx.Context.tt 文件:
if (container.FunctionImports.Any())
{
#>
using System.Data.Objects; // 改成磨辯緩 using System.Data.Entity.Core.Objects;
using System.Data.Objects.DataClasses;
using System.Linq;
}
關(guān)于ef框架怎么更新數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱(chēng)為香港虛擬空間/香港網(wǎng)站空間,或者簡(jiǎn)稱(chēng)香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開(kāi)通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問(wèn)快、穩(wěn)定!
文章標(biāo)題:EF框架數(shù)據(jù)庫(kù)更新教程分享!(ef框架怎么更新數(shù)據(jù)庫(kù))
URL分享:http://m.fisionsoft.com.cn/article/dhjhdsi.html


咨詢
建站咨詢
