下面是我创建的一种方法的示例
我正确实施EF6吗?正如您在我评论的代码中看到的,我首先尝试创建一个存储库类。我改为废弃了这个实现的存储库类。
但是我现在遇到错误,因为我返回一个IQueryable对象,然后关闭dbcontext。
因此,这引出了一个问题:我是否正确实施了EF6?
我可以更改IQueryable以返回using (_myContext)
,或者我可以删除public IQueryable<MY_USERS> GetAllUsers()
{
using (_myContext)
{
return _myContext.MY_USERS;
}
//MyRepository<MY_USERS> users = new MyRepository<MY_USERS>(_myContext);
//return users.GetAll();
}
语句。
我只是想了解实现方法的正确方法。
public void DeleteUser(string userName)
{
using (var context = new MyEFConn())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
context.MY_USER_GROUPS.RemoveRange(GetUserGroups(userName));
context.MY_USERS.Remove(new MY_USERS { USER_NAME = userName });
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
}
}
}
更新示例:
{{1}}
答案 0 :(得分:1)
没有错误或正确,它只是取决于。
当您使用IQueriable时,这意味着您可以在存储库类中使用常见查询,并且在其外部可以添加其他过滤器。
GetAllUsers().Include(u=>u.Roles).Take(10).ToList();
你也可以使用include取决于你的需求,比如说在MVC控制器中
{{1}}
需要注意的重要事项是,在您执行ToList()或迭代抛出查询之前,EF不会连接到db。
最后,正如您在评论中提到的,总是需要记住,当您使用IQuerieable时,可以处理上下文,因此也应该考虑这一点。
另一方面可能是从存储库中返回IEnumerable的好选项,因此,如果您想要加载用户,您应该拥有需要输入参数进行分页,过滤或其他内容的方法。这对测试非常有用,因为您可以模拟数据。
关于删除它总是取决于您的要求,如果您需要一起删除所有内容,或者除了需要使用事务之外什么都不需要。此外,它可能与所有CRUD相同。