我最近與實體框架開始的MVC項目我做得到與技術的夾具和我有幾個問題:..實體框架 - 建議和最佳實踐
我第一個是這個,這是我的一個實體保存代碼 - 這是最好的方式..它看起來有點涉嫌我..
public bool SavePrank(PrankDefinition prank)
{
if (prank == null)
throw new ArgumentNullException("prank");
if (prank.ID == 0)
{
DataBase.Pranks.Add(prank);
DataBase.SaveChanges();
}
else
{
DataBase.Pranks.Attach(prank);
DataBase.Entry(prank).State = EntityState.Modified;
DataBase.SaveChanges();
}
return true;
}
香港專業教育學院還得到這個代碼,獲取最新版本的實體..
public List<PrankDefinition> GetPranks()
{
List<PrankDefinition> pranks = DataBase.Pranks.Where(p => p != null).ToList();
foreach (PrankDefinition prankDef in pranks)
{
DataBase.Entry(prankDef).Reload();
}
return pranks;
}
iive不得不調用實體的重新加載的原因是因爲當另一個客戶端正在使用該項目時 - 實體的更改不會立即反映出來(這很關鍵)。我的問題是 - 有沒有更好的方法來做到這一點?有什麼我可以附加到Where方法來獲取最新版本?
我的上下文 - 如果它可以幫助..
public static DataContext DataBase
{
get
{
if (HttpContext.Current != null && HttpContext.Current.Session["DataBase"]== null)
{
HttpContext.Current.Session["DataBase"] = new DataContext();
}
return HttpContext.Current.Session["DataBase"] as DataContext;
}
set
{
if (HttpContext.Current != null)
HttpContext.Current.Session["DataBase"] = value;
}
}
任何幫助將是非常美妙!
編輯:更新到數據文本
這會是一個更好的實施的DataContext的?
public static DataContext DataBase
{
get { return new DataContext(); }
}
歡呼聲。 ste。
感謝所有隊友的建議。 SavePrank方法是非常自包含的,所以這就是爲什麼我在那時使用SaveChanges - 這仍然是不正確的?..另請參閱更新上下文。 – Steoates
@Stephen:不,在這種特殊情況下並不正確。這就是如何在更復雜的情況下處理SaveChanges的問題。在我看來,將SaveChanges保存在存儲庫之外是更好的方法。您在問題中的更新很糟糕:您每次訪問「數據庫」屬性時都會創建一個新的上下文。 – Slauma