#这里的Entity是基于Entity Framework的Entity.
比如一个用户,有关联的角色,职位,扩展字段等信息,基于EF Code First应该如何构建它们之间的关系比较好呢,而且还要考虑后续转换成DTO的便利性(可能会用到AutoMapper来进行自动转换)?
请各位有相关经验的朋友不吝赐教^_^
目前方案:
应该算是比较直接的方式,每个Entity之间关系密切,就因为关系太紧密了,不好设计DTO,比如User,我只能按需设计DTO,查询的时候变成这样:UserBaseDTO,UserBaseWithExFieldDTO,UserBaseWithRoleDTO etc..,也许是我的想法用问题,我觉得这样相互依赖性太强了,虽然添加/删除/更新便利,但是查询就比较麻烦。
如果直接User 转换成 UserDTO(与User结构一样),这样EF的lazy loading就会导致很差很差的性能,因为导航属性会延迟加载,导致Select User -> Select Role -> Select Role.User。
而且有时候也不需要那么的数据,没必要每个关联的数据都要加载回来。
class User { public Guid Id { get; set; } public string UserName { get; set; } public virtual IList<ExField> Fields { get; set; } public virtual IList<Role> Roles{ get; set; } public virtual IList<Position> Positions { get; set; } } class Role { public Guid Id { get; set; } public string Name { get; set; } public virtual IList<User> Users { get; set; } } class Position { public Guid Id { get; set; } public string Name { get; set; } public virtual IList<User> Users { get; set; } } class ExField { public Guid Id { get; set; } public string PropertyName { get; set; } public virtual User User { get; set; } }
如果把User 和 Role 的关系设计成这样子:
User { Id , UserName} Role { Id, Name} UserRole{ Id,UserId,Role}
当设计DTO的时候就可以这样:
UserDTO { Id, UserName, #Roles} 在查询的的时候手动构建与Role的关系
RoleDTO { id, Name, #Users } 在查询的时候手动构建与User的关系
不知道哪一种方案好些,或者各位有更好的设计方案,或者谈谈各位的经验?
不知道楼主是如何解决的?