我想知道推薦的方法是用IRepository模式處理關係數據。IRepository和關係數據
我的數據庫與括號中列名如下表:
- 計劃(PlanId,名稱,CreationDate, ModifiedDate,ViewId)
- 區(areaID表示,名稱,NTOP,nLeft, nRight ,nBottom)
- 視圖(ViewId,NTOP,nLeft,nRight, nBottom)
- PlanAreas(PlanId,areaID表示)
其中每個計劃可以有零個或多個區域但只有一個視圖,因此Plans.ViewId是FK到Views.ViewId。在PlanAreas中,兩列都是FK到相應的表格。
有時候我的應用程序可能想在區域上獨立行事,但通常我會同時加載,保存,刪除一個計劃及其所有組件(區域,視圖)。
我已經開始沿着小路....
public interface IPlanRepository
{
IEnumerable<MyModel.Plan> GetAll();
MyModel.Plan GetByName(string sName);
MyModel.Plan GetById(string sId);
void Delete(MyModel.Plan plan);
void SaveOrUpdate(MyModel.Plan plan);
}
public class Plan
{
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime Creation { get; set; }
public DateTime Modified { get; set; }
public MyModel.View View { get; set; }
public IList<MyModel.Area> Areas { get; set; }
}
public class View
{
public Guid Id { get; set; }
public IEnvelope Envelope { get; set; } // encapsulates top, left, bottom, right
}
// etc.
的計劃是相當複雜的,所以實際上是更多的屬性,但是這是一個良好的開端。所以現在的問題:
- 我需要IViewRepository和IAreaRepository嗎?
- 在IPlanRepository中實現方法時,是否要執行抓取與計劃相關的關係數據(即區域和視圖)的所有工作並返回完全填充的計劃對象?
或者是否有更高級的「聚合器」(因缺乏更好的詞)在計劃返回後填寫屬性會更好?事情是這樣的:
Plan GetPlanById(string sId) { Plan myplan = new Plan(); IPlanRepository planrepo = new PlanRepoImpl(); myplan = planrepo.GetById(sId); IViewRepository viewrepo = new ViewRepoImpl(); myplan.View = viewrepo.GetByPlanId(sId); return myplan; }
現在我打算使用LINQ-SQL對我的數據訪問,因爲我很熟悉它,我可以很快做到這一點。我可能會轉而採取其他措施,但現在我想保持簡單。
爲什麼你需要存儲庫模式?爲什麼不使用Linq2Sql上下文? –
我在問,因爲對於一般問題沒有最佳方法。有具體問題的最佳方法。你需要明確你需要什麼。 –
因爲LINQ-SQL上下文是一個數據訪問類,並且我的數據庫對象和我的域模型對象之間沒有1:1的對應關係。另外,我希望具有更改數據訪問策略的靈活性,而不必重寫邏輯層。 –