Trước tiên, làm cách nào để sử dụng chế độ xem cơ sở dữ liệu trong mã khung thực thể,
Trước tiên, làm cách nào để sử dụng chế độ xem cơ sở dữ liệu trong mã khung thực thể,
Câu trả lời:
Nếu, giống như tôi, bạn chỉ quan tâm đến thực thể ánh xạ đến từ một cơ sở dữ liệu khác (trong trường hợp của tôi là một lỗi) để liên kết chúng với các thực thể cụ thể của ứng dụng của bạn, thì bạn có thể sử dụng các dạng xem khi bạn sử dụng bảng (ánh xạ chế độ xem trong cùng một cách!). Rõ ràng, nếu bạn cố gắng cập nhật các thực thể đó, bạn sẽ nhận được một ngoại lệ nếu chế độ xem không thể cập nhật. Quy trình giống như trong trường hợp của các thực thể bình thường (dựa trên bảng):
Sử dụng tệp FooViewConfiguration để đặt tên khác cho dạng xem (sử dụng ToTable ("Foo"); trong hàm tạo) hoặc để đặt các thuộc tính cụ thể
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Thêm tệp FooViewConfiguration vào modelBuilder, ví dụ: loại bỏ phương thức OnModelCreating của Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
điều này được cho là đơn giản hơn so với việc sử dụng tạo a EntityTypeConfiguration
.
Đây có thể là một bản cập nhật nhưng để sử dụng các chế độ xem với Mã EF, trước tiên chỉ cần thêm [Bảng ("NameOfView")] vào đầu lớp và tất cả sẽ hoạt động bình thường mà không cần phải trải qua tất cả các vòng mà mọi người khác đang trải qua. Ngoài ra, bạn sẽ phải báo cáo một trong các cột dưới dạng cột [key]. Đây là mã mẫu của tôi dưới đây để triển khai nó.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SomeProject.Data
{
[Table("SomeView")]
public class SomeView
{
[Key]
public int NameID { get; set; }
public string Name { get; set; }
}
}
Và đây là bối cảnh trông như thế nào
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Nếu tất cả những gì bạn muốn là một loạt các đối tượng không chuẩn hóa, thì bạn có thể chỉ cần tạo một thuộc tính chỉ nhận công khai IQueryable<TDenormolized>
trongDbContext
lớp .
Trong get
bạn trả về một kết quả Linq để chiếu các giá trị đã khử chuẩn hóa vào các đối tượng được chuẩn hóa của bạn. Điều này có thể tốt hơn việc viết DB View vì bạn đang lập trình, bạn không bị giới hạn bởi chỉ sử dụng các select
câu lệnh. Ngoài ra, nó là loại thời gian biên dịch an toàn.
Chỉ cần cẩn thận không kích hoạt liệt kê như ToList()
cuộc gọi, điều đó sẽ phá vỡ truy vấn trì hoãn và bạn có thể kết thúc với việc lấy lại một triệu bản ghi từ cơ sở dữ liệu và lọc chúng trên máy chủ ứng dụng của bạn.
Tôi không biết liệu đây có phải là cách đúng không, nhưng tôi đã thử và nó phù hợp với tôi.
Tôi biết đây là một câu hỏi cũ và có nhiều câu trả lời ở đây, nhưng tôi buộc phải gặp sự cố khi sử dụng câu trả lời này và đã xảy ra lỗi khi tôi sử dụng lệnh update-database trong Package Manager Console:
Đã có một đối tượng tên là '...' trong cơ sở dữ liệu.
và tôi sử dụng các bước sau để giải quyết vấn đề này:
hy vọng nó giúp.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Vì vậy, các đồng nghiệp cũng có thể sử dụng nó để nâng cấp cơ sở dữ liệu của họ.