Jak mogę najpierw użyć widoku bazy danych w kodzie struktury jednostki,
Jak mogę najpierw użyć widoku bazy danych w kodzie struktury jednostki,
Odpowiedzi:
Jeśli tak jak ja interesuje Cię tylko mapowanie encji pochodzącej z innej bazy danych (w moim przypadku ERP), aby powiązać je z encjami specyficznymi dla Twojej aplikacji, możesz korzystać z widoków tak, jak korzystasz z tabeli (mapuj widok w w ten sam sposób!). Oczywiście, jeśli spróbujesz zaktualizować te encje, otrzymasz wyjątek, jeśli widoku nie można zaktualizować. Procedura jest taka sama jak w przypadku normalnych (opartych na tabeli) podmiotów:
Użyj pliku FooViewConfiguration, aby ustawić inną nazwę widoku (za pomocą ToTable („Foo”); w konstruktorze) lub ustawić określone właściwości
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Dodaj plik FooViewConfiguration do modelBuilder, na przykład zastępując metodę OnModelCreating metody Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]jest to prawdopodobnie prostsze niż tworzenie pliku EntityTypeConfiguration.
Może to być aktualizacja, ale aby użyć widoków z kodem EF, najpierw dodaj [Table ("NameOfView")] na początku klasy i wszystko powinno działać poprawnie bez konieczności przechodzenia przez wszystkie obręcze, przez które przechodzą wszyscy inni. Będziesz także musiał zgłosić jedną z kolumn jako kolumnę [klucz]. Oto mój przykładowy kod poniżej, aby go zaimplementować.
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; }
}
}
A oto jak wygląda kontekst
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Jeśli wszystko, czego chcesz, to zbiór zdenormalizowanych obiektów, możesz po prostu utworzyć publiczną IQueryable<TDenormolized>właściwość tylko do pobierania w swojej DbContextklasie.
W getzwracasz wynik Linq, aby rzutować zdenormalizowane wartości na zdenormalizowane obiekty. To może być lepsze niż pisanie DB View, ponieważ programujesz, nie jesteś ograniczony tylko do używania selectinstrukcji. Jest również bezpieczny w czasie kompilacji.
Po prostu uważaj, aby nie wywoływać wyliczeń, takich jak ToList()wywołania, które spowodują przerwanie odroczonego zapytania i możesz skończyć z odzyskaniem miliona rekordów z bazy danych i przefiltrowaniem ich na serwerze aplikacji.
Nie wiem, czy to właściwy sposób, ale próbowałem i to działa.
Wiem, że to stare pytanie i jest tu wiele odpowiedzi, ale wymusiłem problem, gdy używam tej odpowiedzi i wystąpił błąd, gdy używam polecenia update-database w konsoli menedżera pakietów:
W bazie danych istnieje już obiekt o nazwie „...”.
i wykonuję następujące kroki, aby rozwiązać ten problem:
mam nadzieję, że to pomoże.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...); Aby współpracownicy mogli również użyć go do aktualizacji swojej bazy danych.