Chuyển chuỗi kết nối đến DbContext đầu tiên mã


92

Làm cách nào để chuyển một chuỗi kết nối tới DbContext đầu tiên của khung thực thể? Tạo cơ sở dữ liệu của tôi hoạt động chính xác khi cả DbContext và chuỗi kết nối trong web.config nằm trong cùng một dự án và được đặt tên giống nhau. Nhưng bây giờ tôi cần di chuyển DbContext sang một dự án khác nên tôi đang thử nghiệm truyền một chuỗi kết nối tới nó như sau:

Mô hình & bối cảnh

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Hoạt động

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

Nếu tôi đặt một điểm ngắt trong hành động phân tích db, thì chuỗi kết nối ở đó, nhưng nó không tạo hoặc tìm thấy cơ sở dữ liệu hoặc bất cứ thứ gì.

Đã xảy ra lỗi liên quan đến mạng hoặc một trường hợp cụ thể khi thiết lập kết nối với SQL Server. Máy chủ này không tìm thấy hoặc không thể truy cập được. Xác minh rằng tên phiên bản là chính xác và SQL Server được cấu hình để cho phép các kết nối từ xa. (nhà cung cấp: Nhà cung cấp đường ống được đặt tên, lỗi: 40 - Không thể mở kết nối với SQL Server)


Bạn có chắc chắn đang kết nối với đúng máy chủ không? Lỗi là một ngoại lệ SQL Server / Express điển hình. Có vẻ như bạn đang kết nối với cơ sở dữ liệu Sql CE ... và EF Code trước tiên sẽ tạo cơ sở dữ liệu nếu nó không tồn tại ... trừ khi có lẽ không thể tìm thấy đường dẫn ...
Steven K.

Vì vậy, về cơ bản, sai lầm của OP là gửi toàn bộ kết nối tới phương thức khởi tạo DbContaxt, thay vì chỉ tên. Như các tài liệu nói: "DbContext (String) Tạo một phiên bản ngữ cảnh mới bằng cách sử dụng chuỗi đã cho làm tên hoặc chuỗi kết nối cho cơ sở dữ liệu"
Göran Roseen

Câu trả lời:


86

Một chút muộn để trò chơi ở đây, nhưng một lựa chọn khác là:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}

2
Chào! Đây là giải pháp duy nhất đưa tôi đến một nơi nào đó. Vấn đề của tôi là tôi muốn lấy cài đặt từ tệp cấu hình Azure của mình thay vì web.config. Tuy nhiên, cách này không hoạt động vì cài đặt 'Nhà cung cấp' bị thiếu (nó được đặt làm thuộc tính trong web.config). Có ý kiến ​​gì không?
người dùng

1
Câu trả lời xuất sắc! Thay đổi duy nhất được thực hiện là xóa tham số connString và sau đó sử dụng chuỗi kết nối được lưu trong cài đặt ứng dụng .... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString
hữu ích. Xem

Làm cách nào để truyền đồng thời cả đối tượng connString và DbCompiledModel dưới dạng tham số?
Behzad Ebrahimi

Đẹp. Chỉ cần "cái này" là thừa, bạn có thể bỏ nó đi.
tocqueville

1
nếu mô-đun lớp học của bạn bao gồm Manual changes to this file will be overwritten if the code is regenerated.trong tiêu đề, sau đó người ta có thể muốn thực hiện điều này trong một lớp học phần theo các lớp học phần và phương pháp (C # Programming Guide)
woodvi

59

Sau khi đọc tài liệu, tôi phải chuyển tên của chuỗi kết nối thay thế:

var db = new NerdDinners("NerdDinnerDb");

Tôi đặt nó trong hàm tạo của mình và đặt nó thành một hằng số chung trong trường hợp nó cần để tham khảo ở nơi khác.
Tony Wall,

37

Tôi nghĩ rằng tôi muốn thêm bit này cho những người đang tìm kiếm "Cách truyền một chuỗi kết nối vào DbContext": Bạn có thể tạo một chuỗi kết nối cho kho dữ liệu cơ bản của mình và chuyển toàn bộ chuỗi kết nối đến phương thức khởi tạo thuộc loại của bạn có nguồn gốc từ DbContext .

(Sử dụng lại Mã từ @Lol Coder) Mô hình và bối cảnh

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Sau đó, giả sử bạn xây dựng một chuỗi Kết nối Sql bằng cách sử dụng SqlConnectioStringBuilder như sau:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Trong đó phương thức GetConnectionString xây dựng chuỗi kết nối thích hợp và SqlConnectionStringBuilder đảm bảo chuỗi kết nối là chính xác về mặt cú pháp; sau đó bạn có thể khởi tạo conetxt db của mình như sau:

var myContext = new NerdDinners(builder.ToString());

4
Mã thực sự khó khăn chuỗi kết nối tôi đã làm:public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
Ê-li W. Gagne

28

Trong DbContext của bạn, hãy tạo một hàm tạo mặc định cho DbContext của bạn và kế thừa cơ sở như sau:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }

1
Trong trường hợp của tôi, nó tạo ra một DB có tên là MyConnectionString... (có tồn tại chuỗi kết nối). Tôi phải đặt name=MyConnectionString.
Matthieu Charbonnier

2

Nếu bạn đang xây dựng chuỗi kết nối trong ứng dụng thì bạn sẽ sử dụng lệnh connString của mình. Nếu bạn đang sử dụng một chuỗi kết nối trong cấu hình web. Sau đó, bạn sử dụng "tên" của chuỗi đó.


2

Tôi có một ví dụ giải pháp nhỏ cho vấn đề đó.

MyDBContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);

1

Kiểm tra cú pháp của chuỗi kết nối của bạn trong web.config. Nó phải là một cái gì đó giống nhưConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"


Chuỗi kết nối hoạt động khi cả hai đều sử dụng cùng một tên trong cùng một dự án.
Shawn Mclean

Nó không hoạt động khi tôi muốn tự vượt qua nó để DbConext
Shawn Mclean

Chuỗi kết nối ổn, đường dẫn không cần tuyệt đối.
Steven K.

1

Khi sử dụng mô hình EF, tôi có một chuỗi kết nối trong mỗi dự án sử dụng mô hình EF. Ví dụ: tôi có một mô hình EF EDMX trong một thư viện lớp riêng biệt. Tôi có một chuỗi kết nối trong dự án web (mvc) của mình để nó có thể truy cập db EF.

Tôi cũng có một dự án thử nghiệm đơn vị khác để thử nghiệm các kho. Để các kho có thể truy cập db EF, tệp app.config của dự án thử nghiệm có cùng một chuỗi kết nối.

Các kết nối DB phải được cấu hình, không phải mã hóa, IMO.


2
Tôi cần chuyển chuỗi kết nối theo mã theo cách thủ công. Tôi đang sử dụng tiêm phụ thuộc.
Shawn Mclean

1

từ đây

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["BloggingDatabase"].ConnectionString);
    }

lưu ý bạn có thể cần thêm Microsoft.EntityFrameworkCore.SqlServer


0

Không thể thấy bất kỳ điều gì sai với mã của bạn, tôi sử dụng SqlExpress và nó hoạt động tốt khi tôi sử dụng chuỗi kết nối trong hàm tạo.

Bạn đã tạo một thư mục App_Data trong dự án của mình, phải không?


0

Đối với bất kỳ ai đến đây đang cố gắng tìm hiểu cách đặt chuỗi kết nối dinamicaly và gặp sự cố với các giải pháp ở trên (như "Định dạng của chuỗi khởi tạo không phù hợp với đặc điểm kỹ thuật bắt đầu từ chỉ mục 0") khi thiết lập chuỗi kết nối trong constructor. Đây là cách khắc phục:

public static string ConnectionString
{
    get {
        if (ConfigurationManager.AppSettings["DevelopmentEnvironment"] == "true")
            return ConfigurationManager.ConnectionStrings["LocalDb"].ConnectionString;
        else
            return ConfigurationManager.ConnectionStrings["ExternalDb"].ConnectionString;
    }
}

public ApplicationDbContext() : base(ConnectionString)
{
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.