2016-11-04 23 views
5

Tôi đang cố gắng chuyển một ứng dụng ASP.NET 4.5 sang .NET Core và tôi có một vấn đề thực sự mà tôi không thể hình dung được..NET Core Entity Framework Các thủ tục lưu sẵn

Ứng dụng hiện tại của tôi thực thi các procs được lưu trữ trả về tập dữ liệu với nhiều datatables. Entity Framework có thể tự động ánh xạ các trường được trả về cho các thuộc tính thực thể của tôi nhưng chỉ hoạt động với dữ liệu đầu tiên trong tập dữ liệu (một cách tự nhiên). Vì vậy, tôi chỉ cố gắng tìm hiểu xem liệu nó có thể chặn đứng quá trình xây dựng mô hình bằng cách nào đó và sử dụng mã tùy chỉnh để xử lý tập dữ liệu và nhìn vào các datatables khác để thiết lập các trường thực thể. Không.

Tôi biết tôi có thể sử dụng cách thông thường để thực hiện quy trình được lưu trữ trực tiếp bằng cách sử dụng SqlConnection nhưng tôi tự hỏi liệu Khuôn khổ thực thể có cách nào để thực hiện việc này không.

+0

Có thể câu trả lời này hữu ích? http://stackoverflow.com/a/9987939/968301 –

+0

Vì vậy, tôi chỉ nhận thấy rằng DataTable và DataSet và tất cả bạn bè của họ không được hỗ trợ trong .NET Core vì chúng được coi là di sản. Vì vậy, tôi phải sử dụng DbReader để thay thế. Tôi có đúng trong giả định này không? – DKhanaf

+0

Tôi nghĩ rằng bạn có thể thực hiện proc được lưu trữ theo cách này: 'dbContext.TableName.FromSql (" saved_proc ")' Tôi không chắc chắn nếu điều đó sẽ bản đồ tất cả các lĩnh vực của bạn từ các bảng khác mặc dù. –

Trả lời

10

Hiện tại, the way to execute stored procedures dữ liệu trả về đó là sử dụng phương thức DbSet.FromSql.

using (var context = new SampleContext()) 
{ 
    var data= context.MyEntity 
     .FromSql("EXEC GetData") 
     .ToList(); 
} 

này có một số hạn chế:

  • Nó phải được gọi trên DbSet
  • Các dữ liệu trả về phải ánh xạ cho tất cả các tài sản trên các loại DbSet
  • Nó không hỗ trợ quảng cáo hoc đối tượng .

Hoặc bạn có thể rơi trở lại ADO.NET đồng bằng:

using (var context = new SampleContext()) 
using (var command = context.Database.GetDbConnection().CreateCommand()) 
{ 
    command.CommandText = "GetData"; 
    command.CommandType = CommandType.StoredProcedure; 
    context.Database.OpenConnection(); 
    using (var result = command.ExecuteReader()) 
    { 
     // do something with result 
    } 
} 

plans to introduce support for returning ad hoc types từ các truy vấn SQL tại một số sân khấu.

+0

Đó là khá nhiều những gì tôi đã kết luận quá từ tất cả các nghiên cứu tôi đã thực hiện. Một cách để giải quyết vấn đề của tôi là giới thiệu một đối tượng DAO có các thuộc tính ánh xạ tới tất cả các trường được trả về từ proc được lưu trữ. Sau đó, sử dụng chuyển đổi tiềm ẩn để chuyển đổi DAO thành đối tượng kinh doanh của tôi áp dụng tất cả các logic cần thiết để chuyển đổi các trường ... – DKhanaf

+0

Một vấn đề còn lại là nhiều tập dữ liệu được trả về bởi proc được lưu trữ. Cách duy nhất tôi có thể giải quyết đó là để chia các storedproc thành hai và gọi chúng riêng lẻ sau đó làm theo các mô hình trên của DAO và trong lớp dịch vụ hợp nhất các DAO vào đối tượng kinh doanh của tôi. Nó có thể là một chút ít hiệu quả kể từ khi tôi đang thực hiện hai cuộc gọi thay vì một cuộc gọi bây giờ, nhưng trong một cách một chút sạch hơn và dễ đọc hơn. – DKhanaf

0

Để trả lời vấn đề của @ DKhanaf với nhiều bộ dữ liệu, bạn có thể sử dụng SqlDataAdapter để điền vào một đối tượng Số liệu với tất cả các kết quả của bạn. SqlDataAdapter yêu cầu toàn bộ .NET Framework, vì vậy bạn phải chạy dự án .NETCore của bạn trong khi nhắm mục tiêu .NET 462 hoặc một cái gì đó tương tự.

  using (var context = new SampleContext()) 
      using (var command = context.Database.GetDbConnection().CreateCommand()) 
      { 
       command.CommandText = "GetData"; 
       command.CommandType = CommandType.StoredProcedure; 
       context.Database.OpenConnection(); 
       using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
       { 
        var ds = new DataSet(); 
        adapter.Fill(ds); 
        return ds; 
       } 

      } 
     } 
Các vấn đề liên quan