Это мой первый вопрос о stackoverflow, поэтому будьте осторожны. Я пишу клиентский портал для складского приложения с использованием MVC4, Entity Framework и SimpleMembership. На складе хранится содержимое нескольких компаний. В каждой компании есть подразделения и отделы. Пользователи будут иметь разный доступ к информации о своей компании, подразделениях и отделах. Ищу элегантное решение для контроля доступа. Пока моя модель выглядит так:
public class UserProfile
{
UserProfile()
{
this.AccessControl = new HashSet<AccessControl>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public Nullable<int> CompanyId { get; set; }
public virtual ICollection<AccessControl> { get; set; }
public virtual Company Company { get; set; }
}
public class AccessControl
{
public int AccessControlId { get; set; }
public int UserId { get; set; }
public int CompanyId { get; set; }
public Nullable<int> DivisionId { get; set; }
public Nullable<int> DepartmentId { get; set; }
public Boolean ReadAccess { get; set; }
public Boolean WriteAccess { get; set; }
// other properties for access control
public virtual UserProfile UserProfile { get; set; }
public virtual Company Company { get; set; }
public virtual Division Division { get; set; }
public virtual Department Department { get; set; }
}
public class Content
{
public int ContentId { get; set; }
public int CompanyId { get; set; }
public int DivisionId { get; set; }
public int DepartmentId { get; set; }
// Various other properties
public virtual Company Company { get; set; }
public virtual Division Division { get; set; }
public virtual Department { get; set; }
}
Я думал, что NULL-разделение означает все подразделения, а NULL-подразделение означает все подразделения. Мои вопросы:
- Каков элегантный способ написать метод репозитория для получения списка объектов Content для пользователя на основе их списка управления доступом, а также для заполнения списков выбора подразделений и отделов в представлениях CRUD?
- Есть ли лучший способ смоделировать этот список управления доступом?
null
случаи для компании, подразделения и отдела делают решение довольно сложным, даже более элегантным решением, которое не будет иметь длинной последовательности различий в регистрах. Безnull
s запрос мог бы быть:var query = from c in context.Contents join a in context.AccessControls on new { c.CompanyId, c.DivisionId, c.DepartmentId } equals new { a.CompanyId, a.DivisionId, a.DepartmentId } where a.UserProfile.UserId == givenUserId select c;
Но мне не удалось как-то расширить это, чтобы охватитьnull
s. - person Slauma   schedule 02.03.2013