Как генерировать представления, используя databasefirst и Entity Framework?
Мне дали решение Visual Studio, чтобы снова приступить к разработке. Проект сначала использует базу данных Entity Framework. Когда я генерирую модель из базы данных, sql хочет преобразовать все представления в таблицы. Я знаю, что с EF следует избегать просмотров, но как лучше всего исправить эту проблему, учитывая, что разработчик больше не работает на нас?
Спасибо
2 ответа
Я пришел к выводу, что нет способа воссоздать представления сущностей в вашем edmx обратно в реальные представления базы данных сервера sql. Что должно произойти, это то, что вы будете генерировать sql из модели и запускать этот sql в анализаторе запросов sql server management studio. Удалите созданные таблицы, которые должны были быть представлениями, и выясните, какой запрос нужно написать, чтобы воссоздать представления в SQL Server, какими они должны быть. Как только это будет сделано, представления в вашей модели должны быть в порядке и обновляться после запуска "Обновление из базы данных".
Скажем, у вас есть две таблицы - категории и продукты. Вы хотите создать представление с именем ProductsWithCategoryName. Когда вы выполняете обновление из базы данных, и это представление добавляется в файл EDMX, просмотр XML показывает следующее:
<EntitySet Name="ProductsWithCategoryName" EntityType="NorthwindModel.Store.ProductsWithCategoryName" store:Type="Views" store:Schema="dbo" store:Name="ProductsWithCategoryName">
<DefiningQuery>
SELECT
[ProductsWithCategoryName].[ProductID] AS [ProductID],
[ProductsWithCategoryName].[ProductName] AS [ProductName],
[ProductsWithCategoryName].[UnitsInStock] AS [UnitsInStock],
[ProductsWithCategoryName].[CategoryName] AS [CategoryName]
FROM [dbo].[ProductsWithCategoryName] AS [ProductsWithCategoryName]
</DefiningQuery>
</EntitySet>
Проблема с вышеупомянутым состоит в том, что определяющий запрос НЕ является запросом, который создает это представление. Чтобы получить правильный определяющий запрос, вы должны отредактировать файл EDMX вручную, добавив к нему правильный запрос следующим образом:
<EntitySet Name="ProductsWithCategoryName" EntityType="NorthwindModel.Store.ProductsWithCategoryName" store:Type="Views" store:Schema="dbo" store:Name="ProductsWithCategoryName">
<DefiningQuery>
SELECT dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.UnitsInStock, dbo.Categories.CategoryName
FROM dbo.Categories INNER JOIN
dbo.Products ON dbo.Categories.CategoryID = dbo.Products.CategoryID
</DefiningQuery>
</EntitySet>
Это по-прежнему не даст ожидаемого результата создания правильного представления SQL. По сути, EF при переходе от концептуальной к базе данных создает только таблицу для каждой сущности, а представления просто рассматриваются как другая сущность.
Нет ничего плохого в использовании представлений с Entity Framework. Я предполагаю, что вы хотите сказать, что при обновлении из базы данных она пытается преобразовать представления в объекты модели. Это совершенно нормально. часто требуется указать первичный ключ для представления. По умолчанию Entity Framework будет пытаться использовать каждое ненулевое свойство в качестве ключа. в контекстном меню для каждого свойства вы можете переключить это.
Вы получаете ошибку?