Tại sao tôi không nên sử dụng mẫu kho lưu trữ với Entity Framework?


203

Trong một cuộc phỏng vấn xin việc, tôi đã được yêu cầu giải thích tại sao mẫu kho lưu trữ không phải là mẫu tốt để làm việc với các ORM như Entity Framework. Tại sao điều này là trường hợp?


60
đó là một câu hỏi mẹo
Omu

2
Tôi có thể đã trả lời người phỏng vấn rằng Microsoft sử dụng mẫu kho lưu trữ rất thường xuyên trong khi họ thể hiện khung thực thể: | .
Laurent Bourgault-Roy

1
Vì vậy, lý do của người phỏng vấn cho nó không phải là một ý tưởng tốt là gì?
Bob Horn

3
Một sự thật buồn cười là việc tìm kiếm "mẫu kho lưu trữ" trong Google cho kết quả chủ yếu liên quan đến Entity Framework và cách sử dụng mẫu với EF.
Arseni Mourzenko

2
kiểm tra blog của ayende ayende.com/blog . Dựa trên những gì tôi biết, anh ấy đã từng sử dụng Mẫu lưu trữ nhưng cuối cùng đã từ bỏ nó để ủng hộ Mẫu đối tượng truy vấn
Jaime Sangcap

Câu trả lời:


99

Tôi không thấy bất kỳ lý do nào để mẫu Kho lưu trữ không hoạt động với Entity Framework. Mẫu lưu trữ là lớp trừu tượng bạn đặt trên lớp truy cập dữ liệu của mình. Lớp truy cập dữ liệu của bạn có thể là bất cứ thứ gì từ các thủ tục lưu sẵn ADO.NET thuần túy đến Entity Framework hoặc tệp XML.

Trong các hệ thống lớn, nơi bạn có dữ liệu đến từ các nguồn khác nhau (cơ sở dữ liệu / XML / dịch vụ web), thật tốt khi có một lớp trừu tượng. Mẫu Kho lưu trữ hoạt động tốt trong kịch bản này. Tôi không tin rằng Entity Framework đủ trừu tượng để che giấu những gì diễn ra sau hậu trường.

Tôi đã sử dụng mẫu Kho lưu trữ với Entity Framework làm phương thức lớp truy cập dữ liệu của mình và vẫn chưa gặp phải vấn đề gì.

Một ưu điểm khác của việc trừu tượng hóa DbContextvới Kho lưu trữ là khả năng kiểm tra đơn vị . Bạn có thể có IRepositorygiao diện của mình có 2 triển khai, một (Kho lưu trữ thực) sử dụng DbContextđể nói chuyện với cơ sở dữ liệu và giao diện thứ hai, FakeRepositorycó thể trả về các đối tượng trong bộ nhớ / dữ liệu giả. Điều này làm cho IRepositoryđơn vị của bạn có thể kiểm tra được, do đó các phần khác của mã sử dụng IRepository.

public interface IRepository
{
  IEnumerable<CustomerDto> GetCustomers();
}
public EFRepository : IRepository
{
  private YourDbContext db;
  private EFRepository()
  {
    db = new YourDbContext();
  }
  public IEnumerable<CustomerDto> GetCustomers()
  {
    return db.Customers.Select(f=>new CustomerDto { Id=f.Id, Name =f.Name}).ToList();
  }
}
public MockRepository : IRepository
{
  public IEnumerable<CustomerDto> GetCustomers()
  {
    // to do : return a mock list of Customers
    // Or you may even use a mocking framework like Moq
  }
}

Bây giờ sử dụng DI, bạn có được việc thực hiện

public class SomeService
{
  IRepository repo;
  public SomeService(IRepository repo)
  {
     this.repo = repo;
  }  
  public void SomeMethod()
  {
    //use this.repo as needed
  }    
}

3
Tôi đã không nói rằng nó sẽ không hoạt động, tôi cũng đã làm việc với mẫu kho lưu trữ với EF, nhưng hôm nay tôi đã được hỏi tại sao CNTT KHÔNG TỐT để sử dụng mẫu với DataBase, ứng dụng sử dụng Cơ sở dữ liệu

2
Ok, vì đây là câu trả lời phổ biến nhất mà tôi đã chọn nó là Câu trả lời đúng

65
Lần cuối cùng phổ biến nhất == là khi nào?
HDave

14
DbContext đã là một kho lưu trữ, kho lưu trữ có nghĩa là một sự trừu tượng hóa ở mức độ thấp. Nếu bạn muốn trừu tượng các nguồn dữ liệu khác nhau, hãy tạo các đối tượng để thể hiện chúng.
Daniel Little

7
ColacX. Chúng tôi đã thử điều đó - DBcontext ngay trong lớp điều khiển - và chúng tôi đang trở lại mẫu repo. Với mẫu Repo, các Bài kiểm tra đơn vị đã đi từ chế độ chế nhạo DbContext lớn liên tục thất bại. EF rất khó sử dụng và dễ vỡ và tốn nhiều giờ nghiên cứu cho các sắc thái của EF. Bây giờ chúng ta có các giả nhỏ đơn giản của repo. Mã sạch hơn. Sự tách biệt công việc rõ ràng hơn. Tôi không còn đồng ý với đám đông rằng EF đã là một mẫu repo và đã có thể kiểm tra được đơn vị.
Rhyous

435

Lý do tốt nhất duy nhất để không sử dụng mẫu kho lưu trữ với Entity Framework? Entity Framework đã thực hiện một mẫu kho lưu trữ. DbContextlà UoW (Đơn vị công việc) của bạn và mỗi DbSetlà kho lưu trữ. Việc thực hiện một lớp khác trên đầu trang này không chỉ dư thừa mà còn khiến việc bảo trì khó khăn hơn.

Mọi người theo mô hình mà không nhận ra mục đích của mô hình. Trong trường hợp mẫu lưu trữ, mục đích là để trừu tượng hóa logic truy vấn cơ sở dữ liệu mức thấp. Trong những ngày xưa khi thực sự viết các câu lệnh SQL trong mã của bạn, mẫu kho lưu trữ là một cách để di chuyển SQL đó ra khỏi các phương thức riêng lẻ nằm rải rác trong cơ sở mã của bạn và bản địa hóa nó ở một nơi. Có một ORM như Entity Framework, NHibernate, v.v. là sự thay thế cho sự trừu tượng mã này và do đó, phủ nhận sự cần thiết của mẫu.

Tuy nhiên, đó không phải là một ý tưởng tồi để tạo ra một sự trừu tượng trên ORM của bạn, không có gì phức tạp như UoW / repostective. Tôi sẽ đi với một mẫu dịch vụ, nơi bạn xây dựng một API mà ứng dụng của bạn có thể sử dụng mà không cần biết hoặc quan tâm liệu dữ liệu đến từ Entity Framework, NHibernate hay API Web. Điều này đơn giản hơn nhiều, vì bạn chỉ cần thêm các phương thức vào lớp dịch vụ của mình để trả về dữ liệu mà ứng dụng của bạn cần. Ví dụ: nếu bạn đang viết ứng dụng Công việc, bạn có thể có một cuộc gọi dịch vụ để trả lại các mục đến hạn trong tuần này và chưa được hoàn thành. Tất cả các ứng dụng của bạn biết là nếu nó muốn thông tin này, nó gọi phương thức đó. Bên trong phương thức đó và trong dịch vụ của bạn nói chung, bạn tương tác với Entity Framework hoặc bất cứ điều gì khác mà bạn đang sử dụng. Sau đó, nếu sau đó bạn quyết định chuyển ORM hoặc lấy thông tin từ API Web,

Nghe có vẻ như đó là một đối số tiềm năng khi sử dụng mẫu kho lưu trữ, nhưng điểm khác biệt chính ở đây là dịch vụ là lớp mỏng hơn và hướng tới việc trả lại dữ liệu được nướng hoàn toàn, thay vì một thứ mà bạn tiếp tục truy vấn, như với kho.


68
Đây dường như là câu trả lời đúng duy nhất.
Mike Chamberlain

10
Bạn có thể giả định DbContexttrong EF6 + (xem: msdn.microsoft.com/en-us/data/dn314429.aspx ). Ngay cả trong các phiên bản ít hơn, bạn có thể sử dụng một DbContextlớp giống như giả với các socked DbSet, vì DbSetthực hiện một iterface , IDbSet.
Chris Pratt

14
@TheZenker, bạn có thể không theo chính xác mẫu kho lưu trữ. Sự khác biệt nghiêm ngặt nhất là giá trị trả lại. Các kho lưu trữ trả về các truy vấn, trong khi các dịch vụ sẽ trả về các liệt kê. Ngay cả điều đó không thực sự là đen và trắng, vì có một số chồng chéo ở đó. Đó là nhiều hơn trong cách bạn sử dụng nó. Một kho lưu trữ chỉ nên trả về tập hợp tất cả các đối tượng mà sau đó bạn truy vấn thêm, trong khi dịch vụ sẽ trả về tập dữ liệu cuối cùng và không hỗ trợ truy vấn thêm.
Chris Pratt

10
Có nguy cơ âm thanh tự cao tự đại: họ sai. Bây giờ, theo như các hướng dẫn chính thức, Microsoft đã lùi lại bằng cách sử dụng các kho lưu trữ từ những gì tôi đã thấy kể từ EF6. Về cuốn sách, tôi không thể nói lý do tại sao tác giả chọn sử dụng kho lưu trữ. Điều tôi có thể nói, khi một người nào đó trong các chiến hào xây dựng các ứng dụng quy mô lớn, là việc sử dụng mẫu kho lưu trữ với Entity Framework là một cơn ác mộng bảo trì. Khi bạn chuyển sang bất cứ thứ gì phức tạp hơn một số kho lưu trữ, cuối cùng bạn sẽ tiêu tốn một lượng thời gian khổng lồ để quản lý kho / đơn vị công việc của bạn.
Chris Pratt

6
Tôi thường chỉ có một dịch vụ cho mỗi cơ sở dữ liệu hoặc phương thức truy cập. Tôi sử dụng các phương thức chung để truy vấn nhiều loại thực thể từ cùng một bộ phương thức. Tôi sử dụng Ninject để đưa ngữ cảnh của mình vào dịch vụ của mình và sau đó dịch vụ của tôi vào bộ điều khiển của mình để mọi thứ đều gọn gàng và ngăn nắp.
Chris Pratt

45

Đây là một từ Ayende Rahien: Kiến trúc trong hố của sự diệt vong: Các tệ nạn của lớp trừu tượng kho lưu trữ

Tôi không chắc liệu tôi có đồng ý với kết luận của anh ấy không. Đó là một cái bẫy 22 - một mặt, nếu tôi bọc Bối cảnh EF của mình trong các kho lưu trữ cụ thể theo loại với các phương thức truy xuất dữ liệu dành riêng cho truy vấn, tôi thực sự có thể kiểm tra mã của mình (loại), gần như không thể với Thực thể Khung một mình. Mặt khác, tôi mất khả năng truy vấn phong phú và duy trì các mối quan hệ ngữ nghĩa (nhưng ngay cả khi tôi có quyền truy cập đầy đủ vào các tính năng đó, tôi luôn cảm thấy như đang đi trên vỏ trứng xung quanh EF hoặc bất kỳ ORM nào khác tôi có thể chọn , vì tôi không bao giờ biết phương thức triển khai IQueryable nào có thể hỗ trợ hoặc có thể hỗ trợ, liệu nó sẽ diễn giải việc tôi thêm vào bộ sưu tập thuộc tính điều hướng như một sáng tạo hay chỉ là một liên kết, cho dù nó sẽ tải lười biếng hay háo hức hay không tải mặc định, v.v. Vì vậy, có lẽ điều này là tốt hơn. "Ánh xạ" đối tượng không trở kháng là một thứ gì đó của sinh vật thần thoại - có lẽ đó là lý do tại sao phiên bản Entity Framework mới nhất có tên mã là "Magic Unicorn").

Tuy nhiên, truy xuất các thực thể của bạn thông qua các phương thức truy xuất dữ liệu dành riêng cho truy vấn có nghĩa là các kiểm tra đơn vị của bạn hiện tại về cơ bản là các kiểm tra hộp trắng và bạn không có lựa chọn nào trong vấn đề này, vì bạn phải biết trước chính xác phương thức lưu trữ mà đơn vị đang kiểm tra sẽ thực hiện gọi để chế nhạo nó. Và bạn vẫn chưa thực sự tự kiểm tra các truy vấn, trừ khi bạn cũng viết các bài kiểm tra tích hợp.

Đây là những vấn đề phức tạp cần một giải pháp phức tạp. Bạn không thể sửa nó bằng cách giả vờ rằng tất cả các thực thể của bạn là các loại riêng biệt không có mối quan hệ giữa chúng và nguyên tử chúng vào kho lưu trữ của riêng chúng. Vâng, bạn có thể , nhưng nó hút.

Cập nhật: Tôi đã có một số thành công khi sử dụng nhà cung cấp Effort cho Entity Framework. Effort là một nhà cung cấp trong bộ nhớ (nguồn mở) cho phép bạn sử dụng EF trong các thử nghiệm chính xác theo cách bạn sẽ sử dụng nó đối với cơ sở dữ liệu thực. Tôi đang xem xét chuyển đổi tất cả các thử nghiệm trong dự án này Tôi đang làm việc để sử dụng nhà cung cấp này, vì nó dường như làm cho mọi thứ dễ dàng hơn nhiều. Đó là giải pháp duy nhất tôi tìm thấy cho đến nay giải quyết tất cả các vấn đề mà tôi đã nói về trước đó. Chỉ có điều là có một chút chậm trễ khi bắt đầu các thử nghiệm của tôi khi nó tạo cơ sở dữ liệu trong bộ nhớ (nó sử dụng một gói khác gọi là NMemory để làm điều này), nhưng tôi không xem đây là một vấn đề thực sự. Có một bài viết về Dự án mã nói về việc sử dụng Effort (so với SQL CE) để thử nghiệm.


3
Bất kỳ bài viết kiến ​​trúc nào mà không đề cập đến kiểm tra đơn vị sẽ tự động được gửi vào thùng rác cho tôi. Một trong những điểm của mẫu kho lưu trữ là để đạt được một số khả năng kiểm tra.
ngủ Smith

3
Bạn vẫn có thể có các bài kiểm tra đơn vị mà không cần bọc Bối cảnh EF (vốn đã là một kho lưu trữ). Bạn nên kiểm tra đơn vị tên miền / dịch vụ của mình chứ không phải truy vấn cơ sở dữ liệu (chúng là kiểm tra tích hợp).
Daniel Little

2
Khả năng kiểm tra của EF đã được cải thiện rất nhiều trong phiên bản 6. Bây giờ bạn có thể hoàn toàn giả DbContext. Bất kể, bạn luôn có thể chế giễu DbSet, và dù sao đó cũng là thịt của Entity Framework. DbContextít hơn một lớp để chứa các DbSetthuộc tính của bạn (kho lưu trữ) trong một vị trí (đơn vị công việc), đặc biệt là trong bối cảnh thử nghiệm đơn vị, trong đó tất cả các công cụ khởi tạo và kết nối cơ sở dữ liệu không muốn hoặc không cần thiết.
Chris Pratt

Mất điều hướng thực thể liên quan là xấu và chống lại OOP, nhưng bạn sẽ có quyền kiểm soát nhiều hơn đối với những gì được truy vấn.
Alireza

Đến thời điểm thử nghiệm, EF Core đã đi một chặng đường dài ngoài hộp In-Memory và In-Memory với các nhà cung cấp Sqlite để cho phép thử nghiệm đơn vị. Mang vào docker khi bạn cần kiểm tra tích hợp để chạy thử nghiệm trên cơ sở dữ liệu được chứa.
Sudhanshu Mishra

16

Lý do tại sao bạn có thể sẽ làm điều đó là vì nó hơi dư thừa. Entity Framework mang đến cho bạn rất nhiều lợi thế về mã hóa và chức năng, đó là lý do tại sao bạn sử dụng nó, nếu sau đó bạn lấy nó và bọc nó trong một mẫu kho lưu trữ mà bạn đang loại bỏ những lợi thế đó, bạn cũng có thể sử dụng bất kỳ lớp truy cập dữ liệu nào khác.


bạn có thể vui lòng cho biết một số lợi thế của "Entity Framework mang lại cho bạn vô số lợi thế về mã hóa và chức năng" không?
ManirajSS

2
đây là những gì anh ấy muốn nói var id = Entity.Where (i => i.Id == 1337) .Single () được gói gọn và bọc cái này trong một kho lưu trữ mà về cơ bản bạn không thể thực hiện logic truy vấn như thế này từ bên ngoài, điều này buộc bạn phải thêm mã vào kho lưu trữ và giao diện để tìm nạp id. B trả về bối cảnh thực thể từ kho lưu trữ để bạn có thể viết logic truy vấn (chỉ vô nghĩa)
ColacX

14

Về lý thuyết tôi nghĩ sẽ hợp lý khi đóng gói logic kết nối cơ sở dữ liệu để làm cho nó dễ sử dụng lại hơn, nhưng như liên kết dưới đây lập luận, các khung hiện đại của chúng ta về cơ bản hiện đang xử lý vấn đề này.

Xem xét lại mẫu lưu trữ


Tôi thích bài viết này, nhưng IMHO cho các ứng dụng doanh nghiệp, lớp trừu tượng giữa DAL và Bl PHẢI có tính năng, vì bạn không thể biết chính xác những gì sẽ được sử dụng vào ngày mai. Nhưng cảm ơn vì đã chia sẻ liên kết

1
Trong khi cá nhân tôi nghĩ rằng điều đó đúng với NHibernate ( ISessionFactoryISessionrất dễ bị chế giễu), thật không dễ dàng gì DbContext, thật không may ...
Patryk wiek

6

Một lý do rất tốt để sử dụng mẫu kho lưu trữ là cho phép tách logic nghiệp vụ của bạn và / hoặc giao diện người dùng của bạn khỏi System.Data.Entity. Có rất nhiều lợi thế cho việc này, bao gồm cả lợi ích thực sự trong thử nghiệm đơn vị bằng cách cho phép anh ta sử dụng Fakes hoặc Mocks.


Tôi đồng ý với câu trả lời này. Các kho lưu trữ của tôi về cơ bản chỉ là các phương thức mở rộng, không làm gì ngoài việc xây dựng các cây biểu thức. Trong một bản tóm tắt đơn giản RẤT đơn giản chỉ cung cấp chức năng chung trực tiếp trên đầu dbcontext. Mục đích thực sự duy nhất của sự trừu tượng là làm cho IoC dễ dàng hơn một chút. Tôi nghĩ mọi người cố gắng làm những việc trong kho của họ mà họ không nên làm. Họ thực hiện repo trên mỗi thực thể hoặc đặt logic nghiệp vụ vào đó trong lớp dịch vụ. Bạn chỉ thực sự cần một repo chung đơn giản. Nó không cần thiết, chỉ cần cung cấp một giao diện nhất quán.
Brandon

Một điều nữa tôi chỉ muốn thêm vào. Có CQRS là một phương pháp vượt trội hơn rất nhiều trong các trường hợp MOST. Đối với một số khách hàng mà tôi đã làm việc khi các cơ sở dữ liệu không hoạt động tốt với các nhà phát triển (điều này xảy ra thường xuyên hơn mọi người nghĩ đặc biệt là tại các ngân hàng), EF qua SQL là lựa chọn tốt nhất. Trong kịch bản cụ thể đó, khi bạn hoàn toàn không có quyền kiểm soát cơ sở dữ liệu của mình, mẫu kho lưu trữ có ý nghĩa. Bởi vì gần giống với cấu trúc dữ liệu và dễ dàng dịch những gì đang diễn ra sang cơ sở dữ liệu và ngược lại. Nó thực sự là một quyết định chính trị và hậu cần theo ý kiến ​​của tôi. Để xoa dịu các vị thần DB.
Brandon

1
Tôi thực sự bắt đầu đặt câu hỏi về ý kiến ​​trước đây của tôi về điều này. EF là mẫu Đơn vị kết hợp và Kho lưu trữ kết hợp. Như Chris Pratt đã đề cập ở trên với EF6, bạn có thể dễ dàng mô phỏng các đối tượng Bối cảnh và Dbset. Tôi vẫn tin rằng việc truy cập dữ liệu nên được bọc trong các lớp để bảo vệ các lớp logic nghiệp vụ khỏi cơ chế truy cập dữ liệu thực tế, nhưng để chuyển toàn bộ con lợn và bọc EF với một kho lưu trữ khác và sự trừu tượng hóa Đơn vị làm việc dường như quá mức cần thiết.
James Culshaw

Tôi không nghĩ rằng đây là một câu trả lời hay vì tuyên bố hỗ trợ của bạn chỉ là có rất nhiều lợi thế trong khi chỉ liệt kê một. Danh sách bạn làm không phải là lý do chính đáng vì bạn có thể sử dụng cơ sở dữ liệu trong bộ nhớ để thực thể thực hiện kiểm tra đơn vị.
Joel McBeth

@jcmcbeth nếu bạn nhìn vào bình luận của tôi ngay phía trên bạn sẽ thấy rằng tôi đã thay đổi ý kiến ​​ban đầu của mình liên quan đến mẫu kho lưu trữ và EF.
James Culshaw

0

Chúng tôi đã gặp sự cố với các phiên bản DbContext của Entity Framework trùng lặp nhưng khác nhau khi một bộ chứa IoC chứa các kho lưu trữ mới () cho mỗi loại (ví dụ: UserRep repository và GroupRep repository mà mỗi cuộc gọi IDbset riêng của chúng từ DBContext), đôi khi có thể gây ra nhiều bối cảnh cho mỗi yêu cầu (trong một bối cảnh MVC / web).

Hầu hết thời gian nó vẫn hoạt động, nhưng khi bạn thêm một lớp dịch vụ lên trên đó và các dịch vụ đó giả sử các đối tượng được tạo với một bối cảnh sẽ được gắn chính xác như các bộ sưu tập con vào một đối tượng mới trong một ngữ cảnh khác, đôi khi nó không thành công và đôi khi không ' t tùy thuộc vào tốc độ của các cam kết.


Tôi đã gặp vấn đề này trong một số dự án khác nhau.
ColacX

0

Sau khi thử mô hình kho lưu trữ trên dự án nhỏ, tôi khuyên không nên sử dụng nó; không phải vì nó làm phức tạp hệ thống của bạn, và không phải vì dữ liệu chế nhạo là ác mộng, mà bởi vì thử nghiệm của bạn trở nên vô dụng !!

Dữ liệu giả định cho phép bạn thêm chi tiết mà không cần tiêu đề, thêm bản ghi vi phạm các ràng buộc cơ sở dữ liệu và xóa các thực thể mà cơ sở dữ liệu sẽ từ chối xóa. Trong thế giới thực, một bản cập nhật có thể ảnh hưởng đến nhiều bảng, nhật ký, lịch sử, tóm tắt, v.v., cũng như các cột như trường ngày sửa đổi lần cuối, khóa được tạo tự động, trường được tính toán.

Trong ngắn hạn, thử nghiệm của bạn trên cơ sở dữ liệu thực cho bạn kết quả thực và bạn có thể kiểm tra không chỉ các dịch vụ và giao diện mà còn cả hành vi của cơ sở dữ liệu. Bạn có thể kiểm tra xem các quy trình được lưu trữ của bạn có thực hiện đúng dữ liệu hay không, trả về kết quả mong đợi hoặc bản ghi bạn đã gửi để xóa thực sự bị xóa! Các thử nghiệm như vậy cũng có thể phơi bày các vấn đề như quên đưa ra lỗi từ thủ tục được lưu trữ và hàng ngàn tình huống như vậy.

Tôi nghĩ khung thực thể triển khai mô hình kho lưu trữ tốt hơn bất kỳ bài viết nào tôi đã đọc cho đến nay và nó vượt xa những gì họ đang cố gắng thực hiện.

Kho lưu trữ là cách tốt nhất vào những ngày chúng tôi sử dụng XBase, AdoX và Ado.Net, nhưng với thực thể !! (Kho lưu trữ trên kho)

Cuối cùng tôi nghĩ rằng có quá nhiều người đầu tư nhiều thời gian vào việc học và triển khai mô hình kho lưu trữ và họ từ chối để nó đi. Chủ yếu là để chứng minh với bản thân rằng họ đã không lãng phí thời gian của họ.


1
Ngoại trừ việc bạn KHÔNG muốn kiểm tra hành vi cơ sở dữ liệu của mình trong các bài kiểm tra đơn vị, vì nó hoàn toàn không phải là mức kiểm tra đó.
Mariusz Jamro

Vâng, những gì bạn đang nói ở đây là thử nghiệm tích hợp , và nó thực sự có giá trị, nhưng thử nghiệm đơn vị hoàn toàn khác nhau. Các bài kiểm tra đơn vị của bạn sẽ không bao giờ đạt được một cơ sở dữ liệu thực sự, nhưng bạn được khuyến khích thêm kiểm tra tích hợp.
Chris Pratt

-3

Nguyên nhân là do Di chuyển: Không thể để di chuyển hoạt động, vì chuỗi kết nối nằm trong web.config. Nhưng, DbContext nằm trong lớp Kho lưu trữ. IDbContextFactory cần phải có chuỗi cấu hình vào cơ sở dữ liệu. Nhưng không có cách nào di chuyển có được chuỗi kết nối từ web.config.

Có nhiều công việc xung quanh nhưng tôi chưa tìm được giải pháp sạch cho việc này!

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.