Я работаю над проектом со следующими условиями:
- 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 - это отношение многие ко многим
Средство и пользователь - это отношение «один ко многим» (один объект может иметь много пользователей, один пользователь может принадлежать только одному объекту)
Теперь мне нужен какой-то способ соединить эти три объекта, чтобы выполнялись следующие условия:
- В системе необходимо иметь возможность подключить пользователя к определенному объекту И определенной категории задач
В традиционной базе данных я бы смоделировал это так:
User_id, Facility_id, TaskCategory_id
1, 1, 1
1, 1, 2
2, 1, 1
1, 2, 1
Это означает, что пользователь 1 будет иметь доступ к категориям задач 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");
});