как использовать представления в Code first Entity framework [закрыто]


Как я могу сначала использовать представление базы данных в коде entity framework,

4 68

4 ответа:

Если, как и я, вы заинтересованы только в отображении сущности, поступающей из другой базы данных (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 ());
    }
    

если все, что вам нужно, это куча де-нормализованных объектов, то вы можете просто создать общедоступный get-only IQueryable<TDenormolized> свойства DbContext класса.

на get вы возвращаете результат Linq для проецирования де-нормализованных значений в ваши де-нормализованные объекты. Это может быть лучше, чем писать представление БД, потому что вы программируете, вы не ограничены только использованием select заявления. Также это тип времени компиляции безопасный.

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

Я не знаю, если это правильный путь, но я попробовал и это работает для меня.

Это может быть обновление, но для использования представлений с кодом EF сначала просто добавьте [Table("NameOfView")] в верхнюю часть класса, и все должно работать правильно, не проходя через все обручи, через которые проходят все остальные. Также вам нужно будет сообщить об одном из столбцов в качестве столбца [key]. Вот мой пример кода ниже, чтобы его реализовать.

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; }
    }
}

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

уже есть объект с именем '...'в базе данных.

и я использую эти шаги, чтобы решить эту проблему:

  1. выполните эту команду в консоли диспетчера пакетов: Add-migration intial
  2. под Папку миграции вы можете найти ..._intial.cs-файл, откройте его и прокомментируйте или удалите любую команду, связанную с вашим классом, который вы хотите сопоставить
  3. теперь вы можете обычно использовать команду update-database для любых других изменений в ваших моделях

надеюсь, что это помогает.