试图找到EF6的正确实现

时间:2016-03-07 18:19:39

标签: c# entity-framework-6

下面是我创建的一种方法的示例 我正确实施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}}

1 个答案:

答案 0 :(得分:1)

没有错误或正确,它只是取决于。

当您使用IQueriable时,这意味着您可以在存储库类中使用常见查询,并且在其外部可以添加其他过滤器。

GetAllUsers().Include(u=>u.Roles).Take(10).ToList();

你也可以使用include取决于你的需求,比如说在MVC控制器中

{{1}}

需要注意的重要事项是,在您执行ToList()或迭代抛出查询之前,EF不会连接到db。

最后,正如您在评论中提到的,总是需要记住,当您使用IQuerieable时,可以处理上下文,因此也应该考虑这一点。

另一方面可能是从存储库中返回IEnumerable的好选项,因此,如果您想要加载用户,您应该拥有需要输入参数进行分页,过滤或其他内容的方法。这对测试非常有用,因为您可以模拟数据。

关于删除它总是取决于您的要求,如果您需要一起删除所有内容,或者除了需要使用事务之外什么都不需要。此外,它可能与所有CRUD相同。