2011-12-12 111 views
2

我的工作有以下條件的項目准入控制:複雜關係/與ASP.NET MVC 3和EF 4.1和POCO

  • Visual Studio 2010中
  • ASP.NET MVC 3
  • EF 4.1(可以用別的東西的話推薦)
  • 守則第一

我想下面的模型,但我堅持我對如何做到這一點BES思考噸。

我有這些對象。

public class Facility 
{ 
    public virtual int FacilityId; 
    public virtual string Name; 
    public virtual List<TaskCategory> TaskCategories; 
} 

public class TaskCategory 
{ 
    public virtual int TaskCategoryId; 
    public virtual string Name; 
} 

public class User 
{ 
    public virtual int UserId; 
    public virtual string Username; 
} 

設施和TaskCategory是一個多到多的關係 設施和用戶是一對多的關係(一個設施可以有多個用戶,一個用戶只能屬於一個設施)

現在我需要一些方法來這三個對象連接,以便滿足以下條件: - 在系統中,應該能夠將用戶連接到特定的設備和某些TaskCategory

在我想傳統的數據庫建模如下:

User_id, Facility_id, TaskCategory_id 
1,  1,   1 
1,  1,   2 
2,  1,   1 
1,  2,   1 

這意味着用戶1將在基金獲得TaskCategories 1和2中的設備1和TaskCateogry 1 2 用戶2將有TaskCategory 1設施1

訪問這是否有道理,以及如何在與EF 4.1(或其他ORM)一起使用的面向對象環境中執行此操作。

UPDATE: 下面的代碼是我最終使用(這裏不包括一些無關緊要件):

public class Facility 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    private ICollection<FacilityMembership> _facilityMembership; 
    public virtual ICollection<FacilityMembership> FacilityMembership 
    { 
     get { return_facilityManager ?? (_facilityManager = new HashSet<FacilityMembership>(); } 
     set { _facilityManager = value; } 
    } 
} 

} 

public class TaskCategory 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    private ICollection<FacilityMembership> _taskMemberships; 
    public virtual ICollection<FacilityMembership> TaskMemberships 
    { 
     get { return _taskMemberships?? (_taskMemberships= new HashSet<FacilityMembership>()); } 
     set { _taskMemberships = value; } 
    } 
} 

public class User 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 

    private ICollection<FacilityMembership> _facilityMembership; 
    public virtual ICollection<FacilityMembership> FacilityMembership 
    { 
     get { return_facilityManager ?? (_facilityManager = new HashSet<FacilityMembership>(); } 
     set { _facilityManager = value; } 
    } 
} 

public class FacilityMembership 
{ 
    public int Id { get; set; } 
    public int FacilityId { get; set; } 
    public int UserId { get; set; } 
    private ICollection<TaskCategory> _taskCategories; 
    public virtual ICollection<TaskCategory> TaskCategories 
    { 
     get { return _taskCategories ?? (_taskCategories = new HashSet<TaskCategories>()); } 
     set { _taskCategories = value; } 
    } 
} 

,然後通過流暢API映射:

 modelBuilder.Entity<FacilityMembership>().HasKey(fm => fm.Id); 
     modelBuilder.Entity<FacilityMembership>() 
        .HasMany(fm => fm.TaskCategories) 
        .WithMany(tc => tc.FacilityMemberships) 
        .Map(m => 
          { 
           m.MapLeftKey("FacilityMembershipId"); 
           m.MapRightKey("TaskCategoryId"); 
          }); 
+0

你需要建立設施和用戶之間的關係..我認爲這是缺少.. –

+0

它的成立,也許我簡化了很多在我上面的例子。這些類有更多的屬性。實際上,用戶擁有「公共虛擬列表設施」 – Sverker84

回答

2

您的傳統數據庫模型表明這是一個多對多的關係(用戶到設施)與其他屬性(任務)。在EF中沒有什麼神奇的方法來實現這一點,它與數據庫中的方法相同,只是具有額外的表/實體。

public class User { 
    ICollection<FacilityTask> FacilityTask {get; set;} 
} 

public class FacilityTask { 
    public Facility Facility {get; set;} 
    public Task Task {get; set;} 
} 

or 

public class FacilityTasks { 
    public Facility Facility {get; set;} 
    public ICollection<Task> Task {get; set;} 
} 

可能有比FacilityTasks更好的命名方案,可能是FacilityMembership?用戶屬於設施,並且有與該會員關聯的任務。

+0

我使用了一個名爲FacilityTaskCategoryUser(Facility,TaskCategory,User)的額外實體。我是否應該以某種方式添加我將其解決到原始問題的方式?感謝您的回答,我認爲這不是最佳實踐解決方案,但它現在可行。 – Sverker84

+0

編輯您的問題並將您的解決方案放在那裏並不會有什麼壞處,您可以幫助其他人或獲得有關如何使某人更好的建議。 – Betty

0

問題:設施有任務,用戶可以擁有彼此不相關的設施和任務?如果是這樣,你會建議你把哪個名字放在桌子上?你可以用這個「名字」創建一個類。

如果沒有,您的用戶可以只是有任務的集合,你可以訪問該設施做

return Tasks.Select(x => x.Facility).Distinct(); 

另一種選擇是在你的用戶類兼具收藏。

+0

設施具有任務,但用戶沒有任何直接任務,只能通過他們「屬於」的設施。也許我在想關於錯誤的方式?系統的核心是設施,對他們來說,任務生成。分配給工廠的TaskCategories是爲了在計劃運行中生成正確的任務。一個設施可以有許多「門衛」,每個「門衛」只允許標記某個任務類別的任務已完成。然後他們可以擁有另一個Facility上的其他TaskCategories的權限。 – Sverker84

+0

因此,看起來您可以在您的User類中擁有一系列設施,並在您的Facility類中擁有一組任務。從數據庫模型的角度來看,你的表任務將有一個外鍵給設施,而設施將有一個外鍵給用戶。如果用戶和設施之間的關係是多對多的,那麼您需要「中間」表。 – ivowiblo