【发布时间】:2015-04-18 02:48:44
【问题描述】:
我有两个 EF 生成的类。
public partial class admin
{
public admin()
{
this.user = new HashSet<user>();
}
public int id { get; set; }//PK
//Other properties omitted for brevity
public virtual ICollection<user> user { get; set; }
}
和
public partial class user
{
public string username { get; set; }//PK
public string passwd { get; set; }
public int admin_id { get; set; }//FK
//Other properties omitted for brevity
public virtual admin admin { get; set; }
}
用户使用 FK admin_id 属于管理员。如果 admin_id 和 username 相等,则用户是管理员。示例:用户“梅西”、“内马尔”、“苏亚雷斯”和“123”都有 admin_id 123。所以用户“123”是管理员。 (也许不是最好的方法,但与问题无关。)
由于这两个类是 EF 自动生成的并且将来可以更改,我有另一个具有相同命名空间但在不同文件夹中的部分用户类(因此保留方法):
public partial class user
{
public bool isAdmin()
{
return admin_id.ToString().Equals(username);
}
}
我也有这个用户存储库:
public class EFUserRepo : IUserRepo
{
private Entities context = new Entities();
public IQueryable<user> Users { get { return context.user; } }
public user getUserByPK(string username)
{
return context.user.Find(username);
}
public user deleteUser(string username){ return null; }//Yet to implement
public bool saveUser(user user){ return false; }//Yet to implement
}
我想用另一种方法来获取给定用户的 useradmin,如下所示:
public user getUserAdmin(string username){ }//Note the return type is user, not admin!
我的问题是,我该把这个方法放在哪里?
我可以像这样把它放在 EFUserRepo 中:
public user getUserAdmin(string username)
{
user user = getUserByPK(username);
if (user == null) return null;
return context.user.Find(user.admin_id);
}
public user getUserAdmin(user user)//Not relevant for question, but might be insightful for others
{
return getUserAdmin(user.username);
}
在我的控制器中调用这个:
user adminUser = repo.getUserAdmin(loggedOnUser.username);//or use repo.getUserAdmin(loggedOnUser) for same result.
或者我可以像这样把它放在部分用户类中:
public user getUserAdmin()
{
return this.admin.user.Where(x => x.isAdmin()).FirstOrDefault();
//Due to DB setup always returns 1 user.
}
在我的控制器中调用这个:
user adminUser = loggedOnUser.getUserAdmin();
我绝对不知道什么是最好的方法。
如果我也想做一个方法,比如:
public admin getAdmin(string username){ }//Note the return type is admin here, not user
然后我可以将它添加到我的用户存储库中:
public admin getAdmin(string username)
{
user user = getUserByPK(username);
if (user == null) return null;
return user.admin;
//return context.admin.Find(user.admin_id);//Also works, but is it best practise to access the admin collection from within the userrepo, think not
//return new EFAdminRepo().getAdminByPK(user.admin_id)//Also works, but seams really ugly
}
public admin getAdmin(user user)//Again, not relevant for question, but might be insightful for others
{
return getAdmin(user.username);
}
在我的控制器中调用这个:
admin admin = repo.getAdmin(loggedOnUser.username);//or use repo.getAdmin(loggedOnUser) for same result.
或者我可以像这样把它放在部分用户类中:
public admin getAdmin()
{
return this.admin.user.Where(x => x.isAdmin()).First().admin;
}
在我的控制器中调用这个:
admin admin = loggedOnUser.getAdmin();
真正的问题可能是,我用吗
ObjectX obj = repo.methodForObtainingObjectX(entity.params);
或
ObjectX obj = entity.methodForObtainingObjectX();
【问题讨论】:
-
您应该将这些方法保存在存储库中。将实体保持为模型总是好的,并且保持尽可能简单。你永远不应该在实体中包含业务逻辑,除非除此之外别无他法。
标签: c# entity-framework asp.net-mvc-3 oop design-patterns