Как я могу сначала использовать представление базы данных в коде структуры сущности,
Как я могу сначала использовать представление базы данных в коде структуры сущности,
Ответы:
Если, как и я, вас интересует только сопоставление сущностей, поступающих из другой базы данных (в моем случае - erp), чтобы связать их с сущностями, специфичными для вашего приложения, то вы можете использовать представления, как вы используете таблицу (сопоставьте представление в так же!). Очевидно, что если вы попытаетесь обновить эти объекты, вы получите исключение, если представление не обновляется. Процедура такая же, как и в случае обычных (основанных на таблице) сущностей:
Используйте файл FooViewConfiguration, чтобы установить другое имя для представления (используя ToTable ("Foo"); в конструкторе) или установить определенные свойства
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Добавьте файл FooViewConfiguration в modelBuilder, например, над методом 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 для проецирования ненормализованных значений в ваши ненормализованные объекты. Это может быть лучше, чем писать представление БД, потому что вы программируете, вы не ограничены только использованием select
операторов. Также это безопасный тип времени компиляции.
Просто будьте осторожны, не запускайте перечисления, такие как ToList()
вызовы, которые нарушат отложенный запрос, и вы можете получить миллион записей обратно из базы данных и отфильтровать их на своем сервере приложений.
Не знаю, правильный ли это способ, но я пробовал, и у меня это работает.
Я знаю, что это старый вопрос, и здесь есть много ответов, но я вынужден был задать проблему, когда использую этот ответ, и при использовании команды update-database в консоли диспетчера пакетов возникла ошибка:
В базе данных уже есть объект с именем "...".
и я использую эти шаги для решения этой проблемы:
Надеюсь, это поможет.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Чтобы коллеги также могли использовать его для обновления своей базы данных.