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 DbContext
klasie.
W get
zwracasz 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 select
instrukcji. 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.