як використовувати представлення даних у коді першої сутності [закрито]


87

Як я можу спочатку використовувати подання бази даних у коді фреймворку сутності,


2
Жодна з наведених нижче відповідей не пояснює, як створити представлення за допомогою міграцій EF. Дивіться цю відповідь на подібне запитання.
Rudey

Ось нитка з точно таким же питанням. - stackoverflow.com/questions/13593845/…
Div Tiwari

Спробуйте моє рішення . Це запобігає генерації міграції для таблиць, позначених як подання,
kogoia

Відповіді:


95

Якщо вас, як і мене, цікавить лише відображення сутності, яка надходить з іншої бази даних (у моєму випадку erp), щоб зв’язати їх із сутностями, специфічними для вашої програми, тоді ви можете використовувати подання, як і таблицю (зіставити подання в так само!). Очевидно, що якщо ви спробуєте оновити ці сутності, ви отримаєте виняток, якщо подання не можна оновлювати. Процедура така ж, як і у випадку із звичайними (на основі таблиці) сутностями:

  1. Створіть клас POCO для подання; наприклад FooView
  2. Додайте властивість DbSet у клас DbContext
  3. Використовуйте файл FooViewConfiguration, щоб встановити інше ім'я подання (використовуючи ToTable ("Foo"); у конструкторі) або встановити певні властивості

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. Додайте файл FooViewConfiguration до modelBuilder, наприклад, ovveriding метод OnModelCreating контексту:

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


3
@DaveJellison, чи хотіли б Ви розробити, або надати посилання на додавання подання як частини IDatabaseInitializer
Ральф

18
Це лише я, або всі отримують порожню таблицю, створену міграцією? Чи є спосіб уникнути цього?
Кремена Лалова

4
Тільки переконавшись тут, чи вимагає це рішення від нас попереднього створення подання в базі даних SQL зовні? Чи можна визначити подання в коді та заповнити його в базі даних за допомогою команди Add-Migration / Update-Database?
frostshoxx

6
Кілька речей. 1. У цій відповіді не згадується, що вам потрібно створити подання вручну за допомогою SQL, це можна зробити за допомогою міграції. 2. Не потрібно налаштовувати назву подання, якщо назва класу відповідає назві подання. 3. Ви можете використовувати DataAnnotations так:, [Table("myView")]це, можливо, простіше, ніж використання EntityTypeConfiguration.
Rudey

23

Це може бути оновленням, але для використання переглядів з 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; }
    }
}

2
Це те саме, що прийнята відповідь, за винятком того, що використовується DataAnnotations, тоді як прийнята відповідь використовує EF Fluid API.
Rudey

4
Насправді ні. Я безуспішно спробував прийняту відповідь, і це мені не вдалося. Але тоді я використовую міграції, тож, можливо, це вплинуло на речі. Я виявив, що спочатку потрібно було виконати міграцію, ПОТІМ додати свій клас перегляду, оскільки він уже існував у базі даних. Ми впоралися б із цим точно так само, якби ми вже мали наявні таблиці в базі даних. Оскільки подання є "віртуальною таблицею", то синтаксис таблиці в Entity Framework все ще працює.
Чарльз Оуен

11

Якщо все, що вам потрібно, - це безліч нормалізованих об’єктів, то ви могли просто створити загальнодоступне IQueryable<TDenormolized>властивість лише для отримання у своєму DbContextкласі.

Коли getви повертаєте результат Linq, щоб проектувати денормалізовані значення у ваші денормалізовані об'єкти. Це може бути краще, ніж писати DB View, оскільки ви програмуєте, ви не обмежені лише використанням selectоператорів. Також це безпечний тип компіляції часу.

Тільки будьте обережні, не запускайте перелічення, такі як ToList()дзвінки, які порушать відкладений запит, і в кінцевому підсумку ви отримаєте мільйон записів назад із бази даних і відфільтруєте їх на сервері додатків.

Я не знаю, чи це правильно, але я спробував, і це працює для мене.


6
Однією з причин, за якими я хотів би використовувати подання, є те, що SQL, згенерований EF, не завжди є "приємним" - у нашій моделі є деякі ієрархії успадкування (про помилки дізналися занадто пізно ...), а використання подань дозволяє вручну створити SQL. Просто контрапункт щодо того, чому погляд буде кращим
Карл,

2
Іншою причиною, щоб не робити цього, може бути використання рекурсивних загальних виразів таблиць, які недоступні в LINQ. Але в іншому випадку це хороша порада для більш простих сценаріїв.
Том Пажурек,

1
Використання властивості замість подання не є можливим, якщо ви хочете скористатися перевагами проіндексованого подання.
Rudey

msgstr "ви не обмежені лише використанням вибраних тверджень". Що ви маєте на увазі під цим? Все, що ви можете зробити з LINQ, можна зробити за допомогою операторів SELECT, те саме не можна сказати і навпаки.
Rudey

3

Я знаю, що це старе запитання, і тут є багато відповідей, але я змусив вирішити проблему, коли використовую цю відповідь, і сталася помилка, коли я використовую команду update-database у консолі диспетчера пакетів:

У базі даних вже є об’єкт з назвою '...'.

і я використовую ці кроки для вирішення цієї проблеми:

  1. запустіть цю команду в консолі диспетчера пакетів: додавання-міграція intial
  2. У папці Міграції ви можете знайти файл ..._ intial.cs, відкрити його та прокоментувати або видалити будь-яку команду, пов’язану з вашим класом, яку ви хочете зіставити
  3. тепер ви можете зазвичай використовувати команду update-database для будь-яких інших змін у своїх моделях

сподіваюся, це допоможе.


1
Дякую! Це справді допомогло! Додатково, замість того, щоб просто видаляти код, згенерований за допомогою міграцій EF, ви можете натомість додати туди migrationBuilder.Sql("CREATE OR REPLACE VIEW ...); Так що колеги можуть також використовувати його для оновлення своєї бази даних.
Rich_Rich
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.