如何更新使用實體框架和EntityState.Modified的對象不是每個領(lǐng)域 如何強制實體框架總是從數(shù)據(jù)庫中獲取更新的數(shù)據(jù)
1. 讓你有要排除的屬性集合的:var excluded = new[] { "property1", "property2" };
隨著EF5在NET 4.5中你可以這樣做:var entry = context.Entry(obj);
entry.State = EntityState.Modified;
foreach (var name in excluded)
{
entry.Property(name).IsModified = false;
}
EF5對.NET 4.5,它允許一個屬性被設(shè)置為即使它已經(jīng)被設(shè)置為修改不修改的新函數(shù)。 ,EF 4.3.1或EF5上NET 4中你可以這樣做,而不是:var entry = context.Entry(obj);
foreach (var name in entry.CurrentValues.PropertyNames.Except(excluded))
{
entry.Property(name).IsModified = true;
}
2. 你不能定義這樣的異常。作為modified不過,您可以標記一個屬性:context.Entry(obj).Property(o => o.Property3).IsModified = true;
context.Entry(obj).Property(o => o.Property4).IsModified = true;
// etc.
請注意,設(shè)置IsModified至false不支持,一旦你已經(jīng)標志著整個實體的狀態(tài)Modified。 你的目的我真的寧愿從數(shù)據(jù)庫中加載實體 CodeGo.net,然后更新正常的更改軌跡:var objInDB = context.Objects.Single(o => o.Id == obj.Id);
obj.Property1 = objInDB.Property1;
obj.Property2 = objInDB.Property2;
context.Entry(objInDB).CurrentValues.SetValues(obj);
context.SaveChanges();
3. 這個問題已經(jīng)很好地回答了,但我想任何人誰愿意它提供。 此代碼為EF 4.3.1開發(fā)//You will need to import/use these namespaces
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
//Update an entity object's specified columns, comma separated
//This method assumes you already have a context open/initialized
public static void Update<T>(this DbContext context, T entityObject, params string[] properties) where T : class
{
context.Set<T>().Attach(entityObject);
var entry = context.Entry(entityObject);
foreach(string name in properties)
entry.Property(name).IsModified = true;
context.SaveChanges();
}
用法示例using (FooEntities context = new FooEntities())
{
FooEntity ef = new FooEntity();
//For argument's sake say this entity has 4 columns:
// FooID (PK), BarID (FK), Name, Age, CreatedBy, CreatedOn
//Mock changes
ef.FooID = 1;
ef.Name = "Billy";
ef.Age = 85;
context.Update<FooEntity>(ef, "Name", "Age"); //I only want to update Name and Age
}
諸葛步13167469496: 提高entity framework 性能,要注意哪些事情 -
泉港區(qū)棘爪: ______ 提高entity framework 性能的注意事項如下:1. 分頁的時候,盡量在數(shù)據(jù)庫里面去分頁.2. 盡量禁用延遲加載,盡量使用預(yù)加載和顯式加載查詢.如果啟用延遲加載,這樣會造成多次往返數(shù)據(jù)庫查詢的.勢必造成性能低下.3. 注意事務(wù)的簡短性.在使用...
諸葛步13167469496: flask - SQLAlchemy 的 update 操作是怎么用的呢 -
泉港區(qū)棘爪: ______ 更新實體屬性 例如:user.name = 'new name' 之后直接添加提交這個實體就更新到數(shù)據(jù)庫了 例如:db.session.add(user) db.session.commit()
諸葛步13167469496: hibernate update 問題 -
泉港區(qū)棘爪: ______ 反射!自己寫一個反射操作方法,獲取數(shù)據(jù)庫中老數(shù)據(jù),再將非空的新屬性SET到老數(shù)據(jù)對應(yīng)的字段就可以了,然后再MERGE或者UPDATE.反射的具體方法是,method[] methods = XXXEntity.getClass().getDeclaredMethods();(可能有拼寫錯誤,請參照API) 然后遍歷methods,找到兩個實體對應(yīng)的get和set方法,將頁面?zhèn)鬟f過來的非空新數(shù)據(jù)對應(yīng)地set到老數(shù)據(jù)中去.不知是否是你需要的?
諸葛步13167469496: 如何:在數(shù)據(jù)庫發(fā)生更改時更新 EDM -
泉港區(qū)棘爪: ______ 模型更新向?qū)Ц鶕?jù)數(shù)據(jù)庫更改而更新 EDM 時將會覆蓋存儲模型.模型更新向?qū)н€會對概念模型和映射進行某些更改,然而只在對象添加到數(shù)據(jù)庫時才會進行這些更改.例如,當表添加到數(shù)據(jù)庫時,新的實體類型將會添加到模型中;當列添加到...
諸葛步13167469496: 利用entity framework修改SQL數(shù)據(jù)庫中數(shù)據(jù) -
泉港區(qū)棘爪: ______ 修改之前 先取得 DB中的值 然后把 你取得的值 負值到ENTITY里邊 修改的時候只是修改當前你要修改的 就可以了 但是會有一個悲觀鎖的問題發(fā)生: 也就是當你取得DB 的值 往ENTITY里放完后,進行修改再更新,這一過程中 有可能 別人在這個時候 把其他的字段給更新了 那么 你就同時把別人的操作給覆蓋了, 這個悲觀鎖的問題有前提條件 才能發(fā)生,就是是否有很多人同時操作這個表
諸葛步13167469496: Entity Framework 5.0 調(diào)用存儲過程 返回值為什么是int類型 -
泉港區(qū)棘爪: ______ 存儲過程的返回值類型固定為int類型,不支持其它類型,函數(shù)才可以返回多樣化類型.如果你要通過存儲過程傳遞數(shù)據(jù)出來,請使用輸出型參數(shù). 這是SQL的基礎(chǔ)知識,和C#無關(guān).
諸葛步13167469496: 自行歸納總結(jié)在實體機上安裝操作系統(tǒng)的基本步驟 -
泉港區(qū)棘爪: ______ 歸納如下:一、準備工作:1、百度“MSDN我告訴你”,下載一個系統(tǒng)鏡像文件.2、在“百度”下載一個“軟碟通”.3、在“驅(qū)動精靈”官網(wǎng)下載一個帶網(wǎng)卡驅(qū)動的“驅(qū)動精靈”.4、準備一個4G或以上的U盤.二、做啟動盤:1、安裝“軟...
諸葛步13167469496: 開發(fā)一個程序,使用實體類 與 直接 調(diào)用運行sql存儲過程的函數(shù) 獲取數(shù)據(jù),有什么區(qū)別? -
泉港區(qū)棘爪: ______ 使用實體類的時候:先通過 某些工具或代碼自動生成的 存儲過程獲取數(shù)據(jù),再加載進實體類,實際上時間消耗比直接sql大,但因為是是靠工具的,而這些工具大都是高手寫的,所以會幫你降低很多隱患 ,比如SQL注入.而且因為他們已經(jīng)寫好...
隨著EF5在NET 4.5中你可以這樣做:var entry = context.Entry(obj);
entry.State = EntityState.Modified;
foreach (var name in excluded)
{
entry.Property(name).IsModified = false;
}
EF5對.NET 4.5,它允許一個屬性被設(shè)置為即使它已經(jīng)被設(shè)置為修改不修改的新函數(shù)。 ,EF 4.3.1或EF5上NET 4中你可以這樣做,而不是:var entry = context.Entry(obj);
foreach (var name in entry.CurrentValues.PropertyNames.Except(excluded))
{
entry.Property(name).IsModified = true;
}
2. 你不能定義這樣的異常。作為modified不過,您可以標記一個屬性:context.Entry(obj).Property(o => o.Property3).IsModified = true;
context.Entry(obj).Property(o => o.Property4).IsModified = true;
// etc.
請注意,設(shè)置IsModified至false不支持,一旦你已經(jīng)標志著整個實體的狀態(tài)Modified。 你的目的我真的寧愿從數(shù)據(jù)庫中加載實體 CodeGo.net,然后更新正常的更改軌跡:var objInDB = context.Objects.Single(o => o.Id == obj.Id);
obj.Property1 = objInDB.Property1;
obj.Property2 = objInDB.Property2;
context.Entry(objInDB).CurrentValues.SetValues(obj);
context.SaveChanges();
3. 這個問題已經(jīng)很好地回答了,但我想任何人誰愿意它提供。 此代碼為EF 4.3.1開發(fā)//You will need to import/use these namespaces
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
//Update an entity object's specified columns, comma separated
//This method assumes you already have a context open/initialized
public static void Update<T>(this DbContext context, T entityObject, params string[] properties) where T : class
{
context.Set<T>().Attach(entityObject);
var entry = context.Entry(entityObject);
foreach(string name in properties)
entry.Property(name).IsModified = true;
context.SaveChanges();
}
用法示例using (FooEntities context = new FooEntities())
{
FooEntity ef = new FooEntity();
//For argument's sake say this entity has 4 columns:
// FooID (PK), BarID (FK), Name, Age, CreatedBy, CreatedOn
//Mock changes
ef.FooID = 1;
ef.Name = "Billy";
ef.Age = 85;
context.Update<FooEntity>(ef, "Name", "Age"); //I only want to update Name and Age
}
相關(guān)評說:
泉港區(qū)棘爪: ______ 提高entity framework 性能的注意事項如下:1. 分頁的時候,盡量在數(shù)據(jù)庫里面去分頁.2. 盡量禁用延遲加載,盡量使用預(yù)加載和顯式加載查詢.如果啟用延遲加載,這樣會造成多次往返數(shù)據(jù)庫查詢的.勢必造成性能低下.3. 注意事務(wù)的簡短性.在使用...
泉港區(qū)棘爪: ______ 更新實體屬性 例如:user.name = 'new name' 之后直接添加提交這個實體就更新到數(shù)據(jù)庫了 例如:db.session.add(user) db.session.commit()
泉港區(qū)棘爪: ______ 反射!自己寫一個反射操作方法,獲取數(shù)據(jù)庫中老數(shù)據(jù),再將非空的新屬性SET到老數(shù)據(jù)對應(yīng)的字段就可以了,然后再MERGE或者UPDATE.反射的具體方法是,method[] methods = XXXEntity.getClass().getDeclaredMethods();(可能有拼寫錯誤,請參照API) 然后遍歷methods,找到兩個實體對應(yīng)的get和set方法,將頁面?zhèn)鬟f過來的非空新數(shù)據(jù)對應(yīng)地set到老數(shù)據(jù)中去.不知是否是你需要的?
泉港區(qū)棘爪: ______ 模型更新向?qū)Ц鶕?jù)數(shù)據(jù)庫更改而更新 EDM 時將會覆蓋存儲模型.模型更新向?qū)н€會對概念模型和映射進行某些更改,然而只在對象添加到數(shù)據(jù)庫時才會進行這些更改.例如,當表添加到數(shù)據(jù)庫時,新的實體類型將會添加到模型中;當列添加到...
泉港區(qū)棘爪: ______ 修改之前 先取得 DB中的值 然后把 你取得的值 負值到ENTITY里邊 修改的時候只是修改當前你要修改的 就可以了 但是會有一個悲觀鎖的問題發(fā)生: 也就是當你取得DB 的值 往ENTITY里放完后,進行修改再更新,這一過程中 有可能 別人在這個時候 把其他的字段給更新了 那么 你就同時把別人的操作給覆蓋了, 這個悲觀鎖的問題有前提條件 才能發(fā)生,就是是否有很多人同時操作這個表
泉港區(qū)棘爪: ______ 存儲過程的返回值類型固定為int類型,不支持其它類型,函數(shù)才可以返回多樣化類型.如果你要通過存儲過程傳遞數(shù)據(jù)出來,請使用輸出型參數(shù). 這是SQL的基礎(chǔ)知識,和C#無關(guān).
泉港區(qū)棘爪: ______ 歸納如下:一、準備工作:1、百度“MSDN我告訴你”,下載一個系統(tǒng)鏡像文件.2、在“百度”下載一個“軟碟通”.3、在“驅(qū)動精靈”官網(wǎng)下載一個帶網(wǎng)卡驅(qū)動的“驅(qū)動精靈”.4、準備一個4G或以上的U盤.二、做啟動盤:1、安裝“軟...
泉港區(qū)棘爪: ______ 使用實體類的時候:先通過 某些工具或代碼自動生成的 存儲過程獲取數(shù)據(jù),再加載進實體類,實際上時間消耗比直接sql大,但因為是是靠工具的,而這些工具大都是高手寫的,所以會幫你降低很多隱患 ,比如SQL注入.而且因為他們已經(jīng)寫好...