kod ilk varlık çerçevesinde görünümler nasıl kullanılır [kapalı]


87

Veritabanı görünümünü önce varlık çerçeve kodunda nasıl kullanabilirim,


2
Aşağıdaki yanıtların hiçbiri, EF geçişlerini kullanarak bir görünümün nasıl oluşturulacağını açıklamaz. Benzer bir soru için bu yanıta bakın .
Rudey

İşte tam olarak aynı soruyu içeren bir başlık. - stackoverflow.com/questions/13593845/…
Div Tiwari

Benim çözümümü dene .
Görünüm

Yanıtlar:


95

Benim gibi, yalnızca başka bir veritabanından (benim durumumda bir erp) gelen haritalama varlığını uygulamanıza özgü varlıklarla ilişkilendirmekle ilgileniyorsanız, bir tablo kullanırken görünümleri kullanabilirsiniz (görünümü eşleştirin aynı yol!). Açıkçası, bu varlıkları güncellemeye çalışırsanız, görünüm güncellenemezse bir istisna alırsınız. Prosedür, normal (bir tabloya dayalı olarak) varlıklar durumunda olduğu gibidir:

  1. Görünüm için bir POCO sınıfı oluşturun; örneğin FooView
  2. DbContext sınıfına DbSet özelliğini ekleyin
  3. Görünüm için farklı bir ad ayarlamak (yapıcıda ToTable ("Foo") kullanarak) veya belirli özellikleri ayarlamak için bir FooViewConfiguration dosyası kullanın

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. FooViewConfiguration dosyasını modelBuilder'a ekleyin, örneğin Context'in OnModelCreating yöntemini geçersiz kılmak:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    

64
"Code First" == otomatik veritabanı oluşturma
onetwopunch

3
@DaveJellison, bir IDatabaseInitializer'ın parçası olarak bir görünüm eklemek için ayrıntılara girmek veya bir bağlantı sağlamak ister misiniz?
Ralph Shillington

19
Sadece ben mi yoksa herkes göçün yarattığı boş bir tablo mu alıyor? Bundan kaçınmanın bir yolu var mı?
Kremena Lalova

4
Sadece burada emin olmak gerekirse, bu çözüm SQL veritabanında önceden harici olarak Görünüm oluşturmamızı gerektiriyor mu? Kodda görünümü tanımlayıp veritabanında Add-Migration / Update-Database komutu ile doldurulmasını sağlamak mümkün müdür?
frostshoxx

6
Bir kaç şey. 1. Bu yanıt, görünümü SQL kullanarak manuel olarak oluşturmanız gerektiğinden bahsetmez, bu bir geçiş kullanılarak yapılabilir. 2. Sınıf adı görünüm adıyla eşleşiyorsa, görünüm adını yapılandırmanıza gerek yoktur. 3. DataAnnotations'ı şu şekilde kullanabilirsiniz: [Table("myView")]Bu, bir EntityTypeConfiguration.
Rudey

23

Bu bir güncelleme olabilir, ancak EF Koduyla görünümleri kullanmak için önce sınıfın en üstüne [Tablo ("NameOfView")] ekleyin ve her şey, herkesin içinden geçtiği tüm çemberlerden geçmek zorunda kalmadan doğru şekilde çalışmalıdır. Ayrıca sütunlardan birini [anahtar] sütun olarak rapor etmeniz gerekecektir. İşte onu uygulamak için aşağıdaki örnek kodum.

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; }
    }
}

Ve işte bağlam nasıl görünüyor

using System.Data.Entity;

namespace SomeProject.Data
{
    public class DatabaseContext : DbContext
    {
        public DbSet<SomeView> SomeViews { get; set; }
    }
}

2
Bu, kabul edilen yanıtla aynıdır, ancak bu DataAnnotations'ı kullanırken kabul edilen yanıt EF Fluid API'yi kullanır.
Rudey

4
Aslında hayır değil. Başarı olmadan kabul edilen cevabı denedim ve bu benim için pek işe yaramadı. Ama sonra Göçleri kullanıyorum, bu yüzden bu olayları etkilemiş olabilir. Veri tabanında zaten var olduğu için önce geçişlerimi yapmak zorunda olduğumu, SONRA görünüm sınıfımı ekledim. Veritabanında zaten mevcut tablolarımız olsaydı, bunu tamamen aynı şekilde ele alırdık. Görünüm bir "sanal tablo" olduğundan, Entity Framework'teki tablo sözdizimi hala çalışır.
Charles Owen

12

Tek istediğiniz bir grup normalize edilmemiş nesneyse, o zaman sınıfınızda herkese açık bir salt-gelir IQueryable<TDenormolized>özelliği oluşturmuş olabilirsiniz DbContext.

İçinde, getnormoalize edilmemiş değerleri normalleştirilmiş nesnelerinize yansıtmak için bir Linq sonucu döndürürsünüz. Bu bir DB Görünümü yazmaktan daha iyi olabilir çünkü programlama yapıyorsunuz, yalnızca kullanmakla sınırlı değilsinizselect ifadeleri . Ayrıca derleme zamanı türü güvenli.

Sadece dikkatli olun, aşağıdaki gibi numaralandırmaları ToList() aramalar , bu ertelenmiş sorguyu bozar ve sonunda veritabanından bir milyon kaydı geri alıp uygulama sunucunuzda filtreleyin.

Bunun doğru yol olup olmadığını bilmiyorum ama denedim ve benim için çalışıyor.


6
Görünümleri kullanmak istememin nedenlerinden biri, EF tarafından oluşturulan SQL'in her zaman 'iyi' olmamasıdır - modelimizde bazı miras hiyerarşilerimiz var (tuzaklar hakkında çok geç öğrendik ...) ve görünümleri kullanmak bize izin veriyor SQL'i manuel olarak oluşturmak için. Bir görüşün neden tercih edilebileceğine dair bir kontrpuan
Carl

2
Bunu yapmamak için diğer bir neden, LINQ'da bulunmayan özyinelemeli ortak tablo ifadelerinin kullanılması olabilir. Ancak aksi halde bu, daha basit senaryolar için iyi bir tavsiyedir.
Tom Pažourek

1
Dizine alınmış bir görünümün avantajlarından yararlanmak istiyorsanız, görünüm yerine özellik kullanmak bir seçenek değildir .
Rudey

"yalnızca select ifadelerini kullanmakla sınırlı değilsiniz". Bununla ne demek istiyorsun? LINQ ile yapabileceğiniz herhangi bir şey, SELECT ifadeleri kullanılarak yapılabilir, aynı şey tam tersi için söylenemez.
Rudey

3

Bunun eski bir soru olduğunu ve burada birçok yanıt olduğunu biliyorum, ancak bu yanıtı kullandığımda bir sorunla karşılaştım ve Paket Yöneticisi Konsolunda güncelleme-veritabanı komutunu kullandığımda bir hata oluştu:

Veritabanında zaten '...' adında bir nesne var.

ve bu sorunu çözmek için şu adımları kullanıyorum:

  1. Paket Yöneticisi Konsolunda şu komutu çalıştırın: Eklenti geçişi
  2. Taşıma klasörünün altında ..._ intial.cs dosyasını bulabilir, açabilir ve eşlemek istediğiniz sınıfınızla ilgili herhangi bir komutu yorumlayabilir veya silebilirsiniz.
  3. artık modellerinizdeki diğer herhangi bir değişiklik için normalde güncelleme-veritabanı komutunu kullanabilirsiniz

Umarım yardımcı olur.


1
Teşekkürler! Bu gerçekten yardımcı oldu! Ek olarak, yalnızca EF Geçişleriyle oluşturulan kodu kaldırmak yerine oraya ekleyebilirsiniz migrationBuilder.Sql("CREATE OR REPLACE VIEW ...); Böylece meslektaşlar da veritabanlarını yükseltmek için kullanabilir.
Rich_Rich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.