Сложные отношения / контроль доступа с ASP.NET MVC 3 и EF 4.1 и POCO - PullRequest
2 голосов
/ 12 декабря 2011

Я работаю над проектом со следующими условиями:

  • 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");
                             });

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Ваша традиционная модель базы данных предполагает, что это отношение «многие ко многим» (пользователь к объекту) с дополнительными свойствами (задачами).В 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 голосов
/ 12 декабря 2011

Вопрос: У объектов есть Задачи, и у пользователя могут быть Услуги и Задачи, которые не связаны друг с другом?Если да, то какое имя вы добавите в таблицу, которую предложили?Вы можете создать класс с этим «именем».

Если нет, у вашего пользователя может быть просто коллекция заданий, и вы можете получить доступ к объектам с помощью

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

Другой вариант - это иметьобе коллекции в вашем классе пользователя.

...