0

我一直在搜索論壇和存儲庫模式博客,瞭解我應該如何編碼我的項目,並堅持下來。任何從你們的幫助或指導將非常認真:)MVC腳手架與存儲庫模式 - 將兒童物品保存爲交易

我開始我的項目作爲EF5 MVC4 Razor Code First,並決定使用MVCScaffolding來生成我所有的控制器,視圖和存儲庫。這是我使用這些技術的第一個項目,我剛纔被告知這就是團隊現在這樣做的過程(但之前的開發人員確實先建模並手動編寫了他們的上下文)。我們正在編碼一堆屏幕,但我們的一個屏幕是一個複雜的屏幕,涉及許多模型/子模塊(即/對象模型具有FK到響應,附件,審閱者等等)。 ...)。用戶添加一堆數據,選擇一個或多個評論者,添加0個或更多附件。然後他們擊中保存!

現在我的大問題是,我想將所有這些數據保存爲一個事務,並且如果某個子模型(即/附件)失敗,事務將回滾。 然而,,創建MVCScaffolding存儲庫的方式,每個模型都有它自己的DB上下文實例,並且它是自己的Save。控制器接受每個唯一的存儲庫作爲加載屏幕數據的參數。另外需要注意的是,在此屏幕中,我們使用ViewModel加載數據,然後編寫自定義映射器以映射回不同模型進行保存。我們可以分別保存每一部分,可能解決方案只是將我的保存包裝到TransactionScope中,但我也想減少對數據庫的調用次數,因爲每個存儲庫都會保存一個調用。

我以爲我可以將代碼添加到父存儲庫的UnitOfWork類型保存,它可以在一個上下文對象中添加/編輯所有子對象,但這看起來像是比任何東西都更加黑客,並且我想要正確編寫代碼。

這裏的其他項目之一隻是做了一個自定義的數據庫上下文,所有的Save方法都在這個類中,這是做到這一點的最好方法嗎?另一個開發人員首先編碼,但手工編碼所有的Save方法。他們都沒有在一個標準的地方,他在內部使用DBContext的TransactionScope(是過度殺傷或DBContext不處理交易)?

因爲我對此很陌生,所以我需要幫助,沒有人和我一起工作似乎同意採用適當的方法。我不確定我的模型對於「MVC應用程序」是否是錯誤的,因爲我是一個數據庫沉重的思考者。

下面是我的模型樣本,任何指導表示讚賞。謝謝:)

public class Anomaly 
{ 
    [Key] 
    public int AnomalyId { get; set; } 

    public string Subject { get; set; } 

    public int PlantId { get; set; } 
    [ForeignKey("PlantId")] 
    public virtual Plant Plant { get; set; } 

    public DateTime? ReviewByDate { get; set; } 

    public virtual ICollection<AnomalyReviewer> AnomolyReviewers { get; set; } 
    public virtual ICollection<AnomalyAttachment> AnomalyAttachments { get; set; } 

} 

    public class AnomalyAttachment 
{ 
    [Key] 
    public int AnomalyAttachmentId { get; set; } 

    public int AnomalyId { get; set; } 
    [ForeignKey("AnomalyId")] 
    public virtual Anomaly Anomaly { get; set; } 

    public string FilePath { get; set; } 
    public string FileName { get; set; } 
    public string FileExtension { get; set; } 
    public string Notes { get; set; }   

} 

ps。這只是一個示例...謝謝!

回答

1

只需創建一個繼承自Controller的類「主」。 然後在公共用戶GetUserById(Int32 id) 中寫入所有查詢。最後創建一個函數,該函數可以調用私有方法! DbContext的實現。

我通常會給這個函數一個SystemEvents的枚舉,所以如果有什麼東西會失敗,我會得到最新發生的參考......當然,您需要編寫自己的notificator或model來記錄自己的錯誤數據庫的個人測試...

我做了這一切,因爲我可以寫我所有的代碼,發現大部分時間,如果你真的想到它的存儲庫模式矯枉過正。