Як я можу спочатку використовувати подання бази даних у коді фреймворку сутності,
Як я можу спочатку використовувати подання бази даних у коді фреймворку сутності,
Відповіді:
Якщо вас, як і мене, цікавить лише відображення сутності, яка надходить з іншої бази даних (у моєму випадку erp), щоб зв’язати їх із сутностями, специфічними для вашої програми, тоді ви можете використовувати подання, як і таблицю (зіставити подання в так само!). Очевидно, що якщо ви спробуєте оновити ці сутності, ви отримаєте виняток, якщо подання не можна оновлювати. Процедура така ж, як і у випадку із звичайними (на основі таблиці) сутностями:
Використовуйте файл FooViewConfiguration, щоб встановити інше ім'я подання (використовуючи ToTable ("Foo"); у конструкторі) або встановити певні властивості
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Додайте файл FooViewConfiguration до modelBuilder, наприклад, ovveriding метод OnModelCreating контексту:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
це, можливо, простіше, ніж використання EntityTypeConfiguration
.
Це може бути оновленням, але для використання переглядів з EF-кодом спочатку просто додайте [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; }
}
}
Якщо все, що вам потрібно, - це безліч нормалізованих об’єктів, то ви могли просто створити загальнодоступне IQueryable<TDenormolized>
властивість лише для отримання у своєму DbContext
класі.
Коли get
ви повертаєте результат Linq, щоб проектувати денормалізовані значення у ваші денормалізовані об'єкти. Це може бути краще, ніж писати DB View, оскільки ви програмуєте, ви не обмежені лише використанням select
операторів. Також це безпечний тип компіляції часу.
Тільки будьте обережні, не запускайте перелічення, такі як ToList()
дзвінки, які порушать відкладений запит, і в кінцевому підсумку ви отримаєте мільйон записів назад із бази даних і відфільтруєте їх на сервері додатків.
Я не знаю, чи це правильно, але я спробував, і це працює для мене.
Я знаю, що це старе запитання, і тут є багато відповідей, але я змусив вирішити проблему, коли використовую цю відповідь, і сталася помилка, коли я використовую команду update-database у консолі диспетчера пакетів:
У базі даних вже є об’єкт з назвою '...'.
і я використовую ці кроки для вирішення цієї проблеми:
сподіваюся, це допоможе.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Так що колеги можуть також використовувати його для оновлення своєї бази даних.