2011-12-12 107 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