0

我一直在尝试创建多对多关系,而不必使用实体框架(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 的东西,(遵循一些例子,例如在 Entity Framework Code First 中为分层数据定义关系)。没有喜悦。

我想避免额外属性的原因是拥有空列表感觉不对,或者更糟糕的角色列表然后列出其他用户。我希望我的域模型是干净的,而不必弯腰使用存储库。

4

1 回答 1

1

如果您选择使用 Entity Framework,除了以 Entity Framework 满意的方式使用之外,别无选择。但为什么这应该是一个重点?我认为首先你应该关注一个简​​单有效的域模型:它强制执行业务规则并与 EF 顺利协作。

其次,有选择:我要暴露什么?您可以将涉及 EF(上下文 + 实体)的所有内容保留在包含授权逻辑的程序集中。因此,您不公开实体类,而是公开专用类(如果您愿意,可以使用 DTO)。你User可能是这样一个类,因为它不会暴露其他用户的角色。显然,它不是 EF 容易填充的类。

您的程序集应该有一个外观或服务类,它公开一些方法,这些方法仅提供客户端代码所需的数据和活动,仅此而已。在内部,它在实体类和 DTO 之间进行映射。

最近,我一直在研究一个授权库,我大致遵循了这些原则,当然,与您的模型存在一些差异。

于 2012-07-30T23:13:17.980 回答