我有以下存儲庫。我有LINQ 2 SQL生成的類和使用工廠的域對象之間的映射。優化存儲庫的SubmitChanges方法
下面的代碼將工作;但我看到兩個潛在的問題
1)它正在更新語句之前使用SELECT查詢。
2)它需要更新所有列(不僅僅是更改的列)。這是因爲我們不知道域對象中的所有列都被更改了。
如何克服這些缺點?
注意:可能會有一些情景(如觸發器)根據特定的列更新執行。所以我無法不必要地更新一列。
REFERENCE:
CODE
namespace RepositoryLayer
{
public interface ILijosBankRepository
{
void SubmitChangesForEntity();
}
public class LijosSimpleBankRepository : ILijosBankRepository
{
private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory();
public System.Data.Linq.DataContext Context
{
get;
set;
}
public virtual void SubmitChangesForEntity(DomainEntitiesForBank.IBankAccount iBankAcc)
{
//Does not get help from automated change tracking (due to mapping)
//Selecting the required entity
DBML_Project.BankAccount tableEntity = Context.GetTable<DBML_Project.BankAccount>().SingleOrDefault(p => p.BankAccountID == iBankAcc.BankAccountID);
if (tableEntity != null)
{
//Setting all the values to updates (except primary key)
tableEntity.Status = iBankAcc.AccountStatus;
//Type Checking
if (iBankAcc is DomainEntitiesForBank.FixedBankAccount)
{
tableEntity.AccountType = "Fixed";
}
if (iBankAcc is DomainEntitiesForBank.SavingsBankAccount)
{
tableEntity.AccountType = "Savings";
}
Context.SubmitChanges();
}
}
}
}
namespace DomainEntitiesForBank
{
public interface IBankAccount
{
int BankAccountID { get; set; }
double Balance { get; set; }
string AccountStatus { get; set; }
void FreezeAccount();
}
public class FixedBankAccount : IBankAccount
{
public int BankAccountID { get; set; }
public string AccountStatus { get; set; }
public double Balance { get; set; }
public void FreezeAccount()
{
AccountStatus = "Frozen";
}
}
}
「這需要更新所有列」。這是什麼性能打擊?你有沒有測量過這個? – Steven
@Steven這是我的假設。畢竟,這是一種不必要的努力 - 在邏輯上。從SQL的角度來看,可能並非如此。此外,可能會有一些情景(如觸發器)根據列更新執行。所以我無法不必要地更新一列。 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=113917 – Lijo
除非你「繼承」數據庫的設計,我覺得你真的不得不重新考慮這種使用觸發器。如果您只是因爲記錄更改而需要觸發,請在表中使用時間戳,並讓您的更新觸發器對此進行響應。 – Pleun