Создание базы данных SQL для SQLite из модели Entity Framework
Можно ли создать базу данных SQLite из модели с каркасом сущности? Я создал соединение SQLite и создал модель, но когда я нажимаю "Создать базу данных из модели", я получаю следующее, которое выглядит как MS SQL и делает ошибки, если выполняется с SQLite (только начало файла):
-- --------------------------------------------------
-- Entity Designer DDL Script for SQL Server 2005, 2008, and Azure
-- --------------------------------------------------
-- Date Created: 11/25/2010 00:26:41
-- Generated from EDMX file: G:\Foo\Bar\Model1.edmx
-- --------------------------------------------------
SET QUOTED_IDENTIFIER OFF;
GO
USE [foobar.sqlite];
GO
IF SCHEMA_ID(N'dbo') IS NULL EXECUTE(N'CREATE SCHEMA [dbo]');
GO
...
Моя строка подключения выглядит следующим образом, поэтому я определенно выбрал правильный тип базы данных:
'metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string="data source=G:\foo\bar\baz"'
Не должно ли это работать?
EDIT:
Поскольку никто, кажется, не знает ответа, я сделаю это проще: возможно ли генерировать код SQL с EF для любой базы данных, отличной от MICROSOFT SQL SERVER?
Ответы
Ответ 1
Я искал для этого решение, когда я наткнулся на эту ссылку: http://code.msdn.microsoft.com/Demo-of-ADONET-POCO-with-140ad3ad
Поместите файл SSDLToSQLite3.tt в C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen, и вы сможете выбрать это как шаблон генерации DDL в конструкторе объектов.
Как только вы это сделаете, модель создаст SQL, подходящую для SQLite.
Ответ 2
Файл SSDLToSQLite3.tt
, похоже, имеет ошибку, в которой первичные ключи не определены для таблиц, которые имеют единственный первичный ключ, который не относится к сорту INTEGER PRIMARY KEY AUTOINCREMENT
.
Самое простое изменение, которое я обнаружил, заключается в том, чтобы изменить line 105
файла .tt
:
if (keyCount > 1)
в
if (keyCount > 1 | (keyCount > 0 & autoIncreaseFieldName == string.Empty))