我一直在尝试创建多对多的关系,而不必使用Entity Framework(MVC4和EF5RC)在我的视图模型中放置未使用的属性。
我有一个User
课程:
public class User
{
public Guid Id { get; set; }
public string[] Roles { get; set; }
public string Name { get; set; }
}
和Role
班级:
public class Role
{
public Role()
{
Users = new List<User>();
}
public int Id { get; protected set; }
public string Name { get; set; }
public string Description { get; set; }
public IList<User> Users { get; set; }
}
我想要实现的是拥有属于某些角色的用户(此时角色的字符串名称),它们可以是多个角色。每个角色可以有多个用户。
我不希望将用户列表放在用户的角色和角色列表中,以便实体框架很满意并保存它。
我一直在尝试使用modelBuilder的东西,(遵循一些例子,如Define relationships for hierarchical data in Entity Framework Code First)。没有快乐。
我想避免额外属性的原因是拥有空列表或者更糟糕的列表然后列出其他用户感觉是错误的。我希望我的域模型是干净的,而不必弯曲以使用存储库。
答案 0 :(得分:1)
如果您选择使用实体框架,那么除了实体框架快乐之外,别无选择。但为什么这应该是一个点呢?我认为首先你应该关注一个简单有效的领域模型:它强制执行业务规则,并与EF顺利合作。
其次,有选择:我会暴露什么?您可以将涉及EF(上下文+实体)的所有内容保留在包含授权逻辑的程序集内部。因此,您不公开实体类,而是公开专用类(如果您愿意,可以使用DTO)。您的User
可能就是这样一个类,因为它不会在角色中公开其他用户。显然,EF不是一个易于填充的课程。
您的程序集应该有一个façade或服务类,它公开了一些方法,这些方法只提供客户端代码所需的数据和活动,仅此而已。在内部,它在实体类和DTO之间进行映射。
最近,我一直在创建授权库,我大致遵循这些原则,当然,与您的模型存在一些差异。