Как создать представление с использованием EF-кода POCO
Это просто. Мне нужно создать Просмотр, используя Code First. Я ничего не нашел об этом в google и SO. Есть ли способ сделать это?
Мне нужно, чтобы представление создавалось и запрашивалось с помощью linq, поэтому это не решение для его создания с использованием script для создания базы данных, например:
var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;
Также возможна работа вокруг. Мне нужен способ запроса сущностей относительно значений констант/не-сущностей.
Ответы
Ответ 1
Вы не можете создавать представления с помощью EF Code First. Если вы хотите создать представление, тогда выполните создание sql script в Seed
. Но вы все равно не сможете сопоставить сущность с этим представлением, за исключением модели взлома, создав и отбросив таблицу с тем же именем, что и ваше представление.
Некоторые полезные ссылки:
Ответ 2
вы должны вручную создать представление, точно так же, как сказал Анатолий. (Добавление индекса в таблицу).
Вы добавляете имя представления в качестве атрибута в свой класс
[Table("UserDTO")]
public class UserDTO
{
/* Class code here */
}
Вы можете создать пустую миграцию, указав в конце атрибут -IgnoreChanges
Add-Migration MigrationName -IgnoreChanges
Это дает вам пустую миграцию script, которую вы можете изменить вручную.
Вы можете использовать свой контекст db для выполнения кода в своем переносе script
public partial class editUserDTO : DbMigration
{
public override void Up()
{
string script =
@"
CREATE VIEW dbo.UserDTO
AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName
FROM dbo.Users u
INNER JOIN dbo.People p ON u.PersonId = p.PersonId";
BloggingContext ctx = new BloggingContext();
ctx.Database.ExecuteSqlCommand(script);
}
public override void Down()
{
BloggingContext ctx = new BloggingContext();
ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO");
}
}
Ответ 3
Просто в головах, в EF 6.1 (не уверен, что раньше или нет) теперь есть опция Code First from Database
, которую вы можете использовать, и она также будет отображаться на представления.
У меня лично есть мой отдельный проект, поэтому я могу просто извлечь код, который я хочу от него, и не повлиять на мой проект, который фактически использует базу данных. Чтобы использовать его Add a New file to your project -> Data -> ADO.NET Entity Data Model
Затем выберите опцию Code First from Database
и выберите ваши представления (и другие таблицы, если хотите)
Он создаст его в виде табличного сопоставления, о котором Фред говорил в своем ответе, но сделает весь код для вас, который хорош. Вероятно, вы захотите изменить индексы и порядок.
Затем просто вызовите Sql(@"YOUR VIEW CREATE SQL HERE")
в Up
и добавьте Sql(@"DROP STATEMENT HERE")
в Down
Ответ 4
Много хороших идей из официальных выпусков EF7:
1) У вас нет DbSet и вместо этого есть свойство или метод расширения
A) Свойство
class YourContext
{
public IQueryable<YourView> YourView
{
get
{
return this.Database.SqlQuery<YourView>("select * from dbo.YourView");
}
}
}
B) Метод расширения
static class YourContextExtensions
{
public static IQueryable<YourView>(this YourContext context)
{
return context.Database.SqlQuery<YourView>("select * from dbo.YourView");
}
2) По-видимому, вы можете заставить процесс миграции игнорировать некоторые dbsets
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (IsMigration)
modelBuilder.Ignore<YourViewTable>();
...
}
(Все вышеперечисленное не проверено)
Ответ 5
Вы не можете создать представление из EF-кода. Сначала вы должны добавить script в "seed" script, чтобы предварительно заполнить представление.