ฉันจะใช้มุมมองฐานข้อมูลในรหัสกรอบงานเอนทิตีก่อนได้อย่างไร
ฉันจะใช้มุมมองฐานข้อมูลในรหัสกรอบงานเอนทิตีก่อนได้อย่างไร
คำตอบ:
หากเช่นฉันคุณสนใจเฉพาะเอนทิตีการแมปที่มาจากฐานข้อมูลอื่น (erp ในกรณีของฉัน) เพื่อเชื่อมโยงพวกเขากับเอนทิตีเฉพาะของแอปพลิเคชันของคุณคุณสามารถใช้มุมมองในขณะที่คุณใช้ตาราง (แมปมุมมองใน ในลักษณะเดียวกัน!) เห็นได้ชัดว่าหากคุณพยายามอัปเดตเอนทิตีนั้นคุณจะได้รับข้อยกเว้นหากไม่สามารถอัปเดตมุมมองได้ ขั้นตอนนี้เหมือนกับในกรณีของเอนทิตีปกติ (ตามตาราง):
ใช้ไฟล์ FooViewConfiguration เพื่อตั้งชื่ออื่นสำหรับมุมมอง (โดยใช้ ToTable ("Foo") ในตัวสร้าง) หรือเพื่อตั้งค่าคุณสมบัติเฉพาะ
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
เพิ่มไฟล์ FooViewConfiguration ไปยัง modelBuilder ตัวอย่างเช่นการวางไข่ของเมธอด OnModelCreating ของ Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
เนื้อหานี้ง่ายกว่าการสร้างไฟล์EntityTypeConfiguration
.
นี่อาจเป็นการอัปเดต แต่หากต้องการใช้มุมมองกับ EF Code ก่อนอื่นให้เพิ่ม [Table ("NameOfView")] ที่ด้านบนสุดของชั้นเรียนและทั้งหมดนี้ควรใช้งานได้ทันทีโดยไม่ต้องผ่านห่วงทั้งหมด นอกจากนี้คุณจะต้องรายงานคอลัมน์ใดคอลัมน์หนึ่งเป็นคอลัมน์ [คีย์] นี่คือโค้ดตัวอย่างของฉันด้านล่างเพื่อใช้งาน
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; }
}
}
และนี่คือลักษณะของบริบท
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
หากสิ่งที่คุณต้องการคืออ็อบเจ็กต์ de-normalized จำนวนมากคุณอาจสร้างIQueryable<TDenormolized>
คุณสมบัติรับอย่างเดียวสาธารณะในDbContext
คลาสของคุณ
ในการget
ส่งคืนผลลัพธ์ Linq เพื่อฉายค่า de-normoalized ลงในอ็อบเจ็กต์ de-normalized ของคุณ สิ่งนี้อาจดีกว่าการเขียน DB View เนื่องจากคุณกำลังเขียนโปรแกรมคุณไม่ได้ถูก จำกัด ด้วยการใช้select
คำสั่งเท่านั้น นอกจากนี้ยังรวบรวมประเภทเวลาที่ปลอดภัย
เพียงระวังอย่าเรียกการแจงนับเช่นการToList()
โทรซึ่งจะทำลายการสืบค้นที่รอการตัดบัญชีและคุณอาจได้รับข้อมูลจำนวนหนึ่งล้านรายการกลับจากฐานข้อมูลและกรองข้อมูลเหล่านั้นบนแอปพลิเคชันเซิร์ฟเวอร์ของคุณ
ฉันไม่รู้ว่านี่เป็นวิธีที่ถูกต้องหรือเปล่า แต่ฉันลองแล้วมันก็ใช้ได้
ฉันรู้ว่านี่เป็นคำถามเก่าและมีคำตอบมากมายที่นี่ แต่ฉันถูกบังคับให้เกิดปัญหาเมื่อฉันใช้คำตอบนี้และเกิดข้อผิดพลาดเมื่อฉันใช้คำสั่ง update-database ใน Package Manager Console:
มีวัตถุชื่อ "... " อยู่แล้วในฐานข้อมูล
และฉันใช้ขั้นตอนเหล่านี้เพื่อแก้ไขปัญหานี้:
หวังว่ามันจะช่วยได้
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); เพื่อให้เพื่อนร่วมงานสามารถใช้เพื่ออัปเกรดฐานข้อมูลได้