「看來愚蠢我有這兩種方法各自查詢數據庫 到檢索和更新記錄」
你是絕對正確的Don't Repeat Yourself應該是
口頭禪
校長你應該努力遵循。
這裏您已選擇檢索頁面加載事件中的數據,並在按鈕單擊事件中再次檢索它。這兩個事件都發生在WebPage的同一個實例中。您可以將它存儲在一個實例變量中並在按鈕單擊中重新使用它,或者您可以爲「延遲加載」的實體設置一個屬性。有各種各樣的方式來做到這一點。延遲加載是
可能
在這裏肯定是過度的,因爲
可能只會使用PageLoad中的屬性
應該理解什麼時候有必要去數據庫,什麼時候不需要。
當首次加載頁面時,需要轉到數據庫以獲取要顯示的數據。此後,當頁面回傳時,數據通常以表單值顯示。
當您更新記錄時,還需要轉到數據庫 - 在此示例中,當用戶單擊保存按鈕時會發生這種情況。
這裏是
延遲加載
東西,我可能不應該提到一個例子:
private People _Person;
//lazy loaded property
private People Person
{
get
{
if (_Person == null)
using (PeopleEntities ctx = new PeopleEntities())
_Person = GetPerson(ctx);
//returning a Person that isn't updateable because we've disposed of the context
return _Person;
}
}
//Retrieve an updateable person
private static object GetPerson(PeopleEntities ctx)
{
return (from a in ctx.People
where a.PersonID == int.Parse(Session["PersonID"]
select a).FirstOrDefault();
}
你的代碼有另外一個問題是,你總是在設置在pageLoad的事件文本框從值數據庫。這意味着當你到達ButtonSave_Click
事件時,返回的值已被數據庫中的內容覆蓋,並且更改不會被保存!
所以,你應該這樣做,而不是:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)//Only do this first time it's loaded
{
TextBoxFirstName.Text = Person.FirstName;
TextBoxLastName.Text = Person.LastName;
}
}
而且您點擊按鈕可以是這樣的:
protected void ButtonSave_Click(object sender, EventArgs e)
{
SavePerson(TextBoxFirstName.Text, TextBoxLastName.Text);
}
private SavePerson(string firstName, string lastName)
{
using (PeopleEntities ctx = new PeopleEntities())
{
var person = GetPerson(ctx);
person.FirstName = firstName;
person.LastName = lastName;
ctx.SaveChanges();
}
}
當你與你的編碼,你會發現,你要重複的SavePerson
進展和GetPerson
其他頁面上的代碼。
- 這是當你開始介紹存儲庫或圖層。
不要忘記
咒語
校長,你應該盡力遵循並將代碼移動到另一個類,以便可以重新使用它。
該類應該在PeopleRepository
或某個其他層。最終你會發現PeopleRepository
中的代碼看起來非常像MantraRepository
中的代碼,你將不再需要爲不同類型重複自己。
那是當你應該開始使用「泛型」。您將PeopleRepository
和MantraRepository
替換爲Repository<People>
和Repository<Mantra>
,並將代碼定義爲類似於public class BaseRepository<T>
之類的一個類。
你去那個旅程,雖然之前有關於實體框架位的另一件事 - 而不是
var query = (from a in ctx.People where a.PersonID == iPersonID select a).FirstOrDefault();
你應該/可以使用
var query = ctx.People.Find(iPersonID)
從這個源:Querying/Finding Entities
「DbSet上的Find方法使用主鍵值嘗試查找由上下文跟蹤的實體 。如果在 上下文中未找到實體,則將查詢發送到數據庫以在那裏查找實體 。如果在數據庫中的上下文或 中未找到實體,則返回空值。
找到的是從兩個顯著方式使用查詢不同:
,往返到數據庫中,如果與 定鍵的實體未在上下文中找到纔會進行。查找將返回 處於已添加狀態的實體。也就是說,查找將返回有 被添加到上下文,但尚未保存到數據庫的實體。」
現在,如果你想做出改變,因爲你沒有重複自己的任何地方你只需要更改GetPerson方法的代碼。
PS爲獲得創紀錄的可能會像這樣的事情,當你終於實現一個通用存儲庫中的代碼。
T e = Context.Set<T>().Find(id)
一號線使用
xxx.xxx.SelectSingleOrDefault(c => c.AccountSenderID == userId_int)
替換使用匿名lambda表達式(例如使用VAR)
xxx.xxx.Select(c => new { c.FriendInvitationID,c.AccountSenderID,
c.Account1.AccountID, c.Account1.FirstName, c.Account1.LastName, c.Account1.Email,
c.FriendInvitationStatus, c.CreationDate })
.Where(c => c.AccountSenderID == userId_int).ToList();
你沒有,即使匿名描述你的對象,讓他們所有
使用 SelectSingleOrDefault(c => c.id == myid) – d1jhoni1b