Veritabanı görünümünü önce varlık çerçeve kodunda nasıl kullanabilirim,
Veritabanı görünümünü önce varlık çerçeve kodunda nasıl kullanabilirim,
Yanıtlar:
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:
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");
}
}
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 ());
}
[Table("myView")]
Bu, bir EntityTypeConfiguration
.
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; }
}
}
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, get
normoalize 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.
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:
Umarım yardımcı olur.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Böylece meslektaşlar da veritabanlarını yükseltmek için kullanabilir.