【发布时间】:2012-01-18 14:44:48
【问题描述】:
我正在从事具有以下条件的项目:
- Visual Studio 2010
- ASP.NET MVC 3
- EF 4.1(如果推荐可以使用其他东西)
- 代码优先
我正在尝试对以下内容进行建模,但我一直在思考如何做到最好。
我有这些物品。
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;
}
Facility 和 TaskCategory 是多对多的关系 设施和用户是一对多的关系(一个设施可以有多个用户,一个用户只能属于一个设施)
现在我需要一些方法来连接这三个对象,以便满足以下条件: - 在系统中,应该能够将用户连接到某个设施和某个 TaskCategory
在传统数据库中,我会这样建模:
User_id, Facility_id, TaskCategory_id
1, 1, 1
1, 1, 2
2, 1, 1
1, 2, 1
这意味着用户 1 可以访问设施 1 中的任务类别 1 和 2,以及设施 2 中的任务类别 1。 用户 2 将有权访问设施 1 中的 TaskCategory 1。
这是否有意义,我将如何在与 EF 4.1(或其他 ORM)一起使用的面向对象环境中执行此操作。
更新: 以下代码是我最终使用的(一些不相关的部分不包括在内):
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; }
}
}
然后通过fluent 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");
});
【问题讨论】:
-
您需要在 Facility 和 User 之间建立关系..我认为缺少..
-
它成立了,也许我在上面的例子中简化了很多。这些类有更多的属性。实际上,用户拥有“公共虚拟列表
设施”的属性
标签: c# entity-framework-4 ef-code-first poco code-first