尝试捕获EF6尝试连接到SQL Server

时间:2017-07-27 09:34:12

标签: c# entity-framework

我试图尝试连接到SQL服务器时尝试在EF 6中尝试捕获,这样我不仅可以记录错误消息,还可以向用户发出明确的消息,说明"有一个连接数据库时出错。请联系您的系统管理员"。

原因是我不想向用户显示从EF收到的长卷错误消息

  

"访问数据库时出错。这通常意味着   与数据库的连接失败。检查连接字符串是否为   更正并且正在使用适当的DbContext构造函数   指定它或在应用程序的配置文件中找到它。看到   http://go.microsoft.com/fwlink/?LinkId=386386了解有关的信息   DbContext和连接。有关详细信息,请参阅内部异常   。失败"

以下是我的代码:

namespace MyRepositories.MSSQL.DatabaseContext
{
    public class MyDbContext : DbContext
    {
        public MyDbContext()
            : base("name=MyConnection")
        {

        }

        public virtual IDbSet<DBConnection> DBConnections { get; set; }
        public virtual IDbSet<CustomerAction> CustomerActions { get; set; }
        public virtual DbSet<Action> Actions { get; set; }     

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {


        }
    }
}

存储库中的代码如下:

namespace myRepositories.MSSQL
{
    public class AccRepository : BaseRepository, IAccRepository
    {
        public AccountsRepository(MyDbContext dbContext)
        {
            _databaseContext = dbContext;
        }

        public IQueryable<Role> GetRoles()
        {
            var roles = _databaseContext.Roles.AsQueryable();
            return roles;
        }

        public IQueryable<UserRole> GetUserRoles()
        {
            var userRoles = _databaseContext.UserRoles.AsQueryable();
            return userRoles;
        }

        public List<RolePermission> GetRolePermissions(Role role)
        {
            var rolePermissions = _databaseContext.RolePermissions.Where(s => s.RoleID == role.RoleID).ToList();
            return rolePermissions;
        }

        public List<UserRole> GetUserRoles(UUser user)
        {
            var userRoles = _databaseContext.UserRoles.Where(s => s.UserID == user.UserID);
            return userRoles.ToList();
        }
    }
}

执行此操作的另一个原因是此dbcontext连接到SQL服务器,由于各种原因多次不可用(我知道修复SQL服务器会更好,但它不属于我们和第三方所有者不愿意修理它)

此外,我不想在上面提到的每个存储库方法周围放置一个try catch块(这只是我上面说过的一个repo代码,我们为这个SQL数据库服务器提供了另外20个不同的存储库)

我现在搜索了很多网页,无法找到任何相关内容,因此如果有人帮我解决这个问题,我将非常感激。

1 个答案:

答案 0 :(得分:-1)

DbContext是ObjectContext的包装器,在访问repo之前检查这个How to: Manually Open the Connection from the Object Context还是创建一个代理类来实例化repo?

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{    
    context.Connection.Open();

或检查数据库是否存在Database.Exists Method

只需使用存在

if (myDbContext.Database.Exists()){
// call your operation here
}