2012-01-31 25 views
1

我是ASP.NET的新手,所以我的問題可能會受到多年來使用Java/JSF的愚蠢和影響。ASP.NET - 如何使用實體框架來構建MVC3模型和視圖?

我想實現一個使用ASP.NET MVC3和實體框架4.1的Web應用程序。由於它是一個業務應用程序,它應該通過防止數據操作和併發的方式來保證安全。

因此,我計劃使用實體框架支持的樂觀鎖定。但是當談到使用MVC範例及其提供的選項時,我不確定如何實現上面提到的安全方面。

我與實體類型 「客戶」,其具有的屬性

  • ID(數據庫PK)
  • 名稱
  • 生日
  • 版域模型(用於樂觀鎖定)

爲了製備它爲一個視圖編輯其數據,我另外使用一個視圖模式「customerView」具有以下屬性

  • 名稱

在控制器I加載特定的記錄從數據庫中將值傳遞給視圖模型並將其放入強類型視圖中。這很有效 - 價值顯示在Web表單中,我可以回發更改。由於視圖模型不包含標識和版本(導致未成爲回發的一部分),因此我無法將值映射回域模型,因爲它在請求 - 響應 - 生命週期中丟失了。

當然,我可以添加ID和版本作爲隱藏的輸入字段,我想避免它,因爲它啓用了數據操作。在發佈數據之前,有人可能會更改ID或版本,這可能會導致不必要的行爲,因爲我無法將發送回服務器的數據與發送到Web表單的數據(特別是ID和版本)進行比較。

我想一種方法是存儲我在會話中顯示編輯視圖之前獲取的數據記錄/域模型(或至少是記錄的ID),以避免發送不需要的字段來回發送,儘管我知道這不是最好的方式,可能會影響應用程序性能。怎麼樣使用另一個會話狀態,然後是默認的狀態,例如SQL Server?這可以保存至少一個數據庫操作,因爲我不必再次從數據庫加載記錄,以便從視圖模型中傳送值。我可以從會話中獲取域模型記錄,甚至可以檢查數據操作。

我希望這個例子能說明我面臨的問題。

也許有更好的方法來解決這些問題。也許我完全困惑;)

回答

0

當談到競爭條件時,首先要問的問題應該是:併發活動實際上導致無效記錄的概率是多少?

你的情況:如果你有一個帶有ID,姓名和生日的客戶,我不能想到兩個併發用戶同時編輯客戶並輸入不同數據的情況。爲什麼一個用戶輸入一個姓名或生日,而另一個用戶同時輸入不同的姓名或生日?

我想說的是:在大多數情況下,相比於可用性的努力和喪失以及鎖定和類似保護手段帶來的性能,問題的可能性可以忽略不計。

的話題一篇很好的文章:Race Conditions Don't Exist由烏迪大漢

+0

感謝您的回答。正如我所說的,這只是一個簡單的例子。我明白你的觀點,但是你經常需要記住,即使該潛在性很小,當問題發生時,軟件或公司的聲譽可能會受到嚴重影響。此外,此軟件可能需要進行審覈,所以我更願意在之前處理這些問題。 – Florian 2012-01-31 10:07:40

+0

我明白你的關心。我可能聽起來像一個政治家,但我擔心,你的問題的唯一答案是:這取決於。沒有最佳實踐或規範解決方案,特別是在涉及安全性,可靠性和一致性時。您可能需要考慮CQRS,這是一種內在處理多個用戶並可以提供故障安全審覈機制的架構模式。一個好的起點是http://cqrs.wordpress.com/documents/和http://abdullin.com/cqrs – 2012-01-31 10:19:11

0

你必須包含在你看來你的ID,沒有別的辦法。至於數據操作 - 您必須檢查(每次保存時)允許用戶使用此ID修改對象。

版本戳記也是如此,但在這種情況下,您不必擔心數據操作,因爲幾乎沒有手動生成時間戳與數據庫中的匹配,如果它們不匹配,將不會有編輯,所以你很安全。 當您傳遞正在編輯的每個字段的原始值時,您可以切換其他併發檢查方案。