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

創(chuàng)新互聯(lián)主營錦屏網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),錦屏h5小程序定制開發(fā)搭建,錦屏網(wǎng)站營銷推廣歡迎錦屏等地區(qū)企業(yè)咨詢
一、EF更新原理
EF更新實(shí)際上是基于EF的Change Tracking機(jī)制。當(dāng)我們修改了數(shù)據(jù)實(shí)體的屬性值之后,EF會自動將這些修改的內(nèi)容保存起來,然后等我們調(diào)用SaveChanges方法時一次性提交,將這些修改保存到數(shù)據(jù)庫中。
二、常用更新方法
1.Update方法
Update方法是最常用的更新方法,它的工作原理是先將數(shù)據(jù)實(shí)體查詢出來,再將修改后的屬性重新賦值,最后調(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方法常用于從一個HTTP POST中恢復(fù)一個已經(jīng)被刪除的實(shí)體,或者是在自定義數(shù)據(jù)合并代碼中合并來自多個源的實(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語句進(jìn)行批量更新
我們可以使用Sql語句進(jìn)行批量更新操作。在EF上下文中獲取Database對象,然后使用ExecuteSqlCommand方法執(zhí)行相應(yīng)的Sql語句。示例代碼如下:
“`
var sql = “UPDATE [User] SET [Name] = ‘新的用戶名’ WHERE [Id] = 1”;
using (var context = new DbContext())
{
context.Database.ExecuteSqlCommand(sql);
}
“`
2.使用BulkExtensions進(jìn)行批量更新
BulkExtensions是一款開源的EF擴(kuò)展庫,它提供了一個非常方便的批量操作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ù)快速復(fù)制到SQL Server表中。我們可以使用SqlBulkCopy將數(shù)據(jù)集中的數(shù)據(jù)批量更新到數(shù)據(jù)庫中。示例代碼如下:
“`
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);
}
}
“`
四、常見的更新問題
1.更新時間的自動更新問題
在某些場景下,比如我們需要記錄用戶的創(chuàng)建時間和最后修改時間等,在修改數(shù)據(jù)實(shí)體時,我們需要保留這些時間的信息,而不能將這些時間覆蓋掉。此時,我們可以使用DataAnnotations中的屬性,將更新時間添加到數(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)屬性的問題
我們在更新數(shù)據(jù)實(shí)體時可能會修改它的關(guān)聯(lián)屬性,此時我們需要將關(guān)聯(lián)屬性再次查詢出來后再進(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í)體時的并發(fā)問題
在多線程或分布式系統(tǒng)環(huán)境中,當(dāng)多個線程或服務(wù)同時操作同一數(shù)據(jù)實(shí)體時,可能會發(fā)生并發(fā)問題。EF框架提供了EntityState標(biāo)識和rowversion標(biāo)識等方法解決并發(fā)問題。示例代碼如下:
“`
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ù)已被其他人修改,請刷新后再試!”);
}
}
“`
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
EF中的code first模式 怎么創(chuàng)建數(shù)據(jù)庫
方法/步驟
EF的Code First模式不需要我們創(chuàng)建什么數(shù)據(jù)向?qū)?,直接寫代碼就行了。我們用NET最簡單的控制臺應(yīng)用程序來說明。如下圖所示
下面我們新建兩個實(shí)體,一個實(shí)體是班級對象,一個實(shí)體是學(xué)生對象,注意這兩個對象是一對多的關(guān)系,他們的構(gòu)建如下圖所示,注意他們聲明上喊返面的屬性標(biāo)識
然后我們需要引用兩個庫,一個就是我們的EntityFramework,另一個就是System.Data.Entity
下面就舉旅是主要寫EF的上下文對象了,如下圖所示,需要繼承EF的DbContext。注意base里的名字為連接字符串名字,在App.Config中配置即可。為了說明CodeFirst的魅力,這里我填寫的數(shù)據(jù)庫,在數(shù)據(jù)庫中并沒有
下面我們在主函數(shù)中新增班級對象,然后執(zhí)行EF的SaveChanges方法
看一下我們正滲凳的數(shù)據(jù)庫吧,你會發(fā)現(xiàn)數(shù)據(jù)庫中是不是多出來了一個我們在配置文件中寫的數(shù)據(jù)庫名字,并且也已經(jīng)將表創(chuàng)建好了
通過以上的步驟,你感覺到EF的Code First模式的魅力了沒,自動創(chuàng)建數(shù)據(jù)庫以及表。這也是現(xiàn)在應(yīng)用最多的模式了,好了,這次分享就到這里。有什么問題的話,留言咨詢即可。
微軟EF框架存儲過程問題,VS2023+.NET4.5+EF6.1.1
我用的是5.0沒這個問題,不過如果你理解T4模板的話這個問題很好解決。
這個應(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ù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
文章標(biāo)題:EF框架數(shù)據(jù)庫更新教程分享!(ef框架怎么更新數(shù)據(jù)庫)
地址分享:http://www.5511xx.com/article/dhjhdsi.html


咨詢
建站咨詢
