I am trying my hardest to find the simplest way to create a basic "model first" entity framework example. However I am struggling with the actually generation of the database, particularly the running of the SQL against the database.
Tools
- Visual Studio 2010
- SQL Server 2008 Express
Process
- Create a new class project
- Add a new Server-Database item (mdf) named "Database1.mdf" to the project
- Add an empty ADO.net Entity Model
- Create a simple entity (Person: Id, Name)
- Generate the Script selecting the Database1 connection created for me by visual studio
- Right click the script editor and select the "Execute SQL..." option
- Log in to SQLEXPRESS
This is where is falls over saying it cant find a database name "Database1".
The "problem" is that the SQL server has not had Database1 attached to it. I am 100% positive that Visual Studio use to attach a database to SQLExpress when it created a new database (Step 2). This appears to not be the case any more (even the beta of VS2010 did it). Can someone confirm this? or tell me how to get this to happen?
Is there a way that I can modify the TSQL script to use an un-attached database. ie a file.
I know I can use SQL Management Studio or sqlcmd to attach the database, but I would ideally like to avoid the solutions as I would like to see the cleanest method of just using visual studio.
Ideal Solutions (in order of most prefered)
- Get visual studio to attach the newly created database
- Modify the generated SQL to point to file
Thanks in advance.
The method I've found to consistently work (at least with VS 2010 and SQL Server (2008|2008 R2) Express) is to:
- Create the ADO.NET Entity Model
- Create the .mdf database, but don't add any tables to it
- Copy the connection string from Server Explorer -> Modify Connection -> Advanced (bottom row)
- Close the connection in Server Explorer
- Generate the SQL script through "Generate Database from Model"
- When the SQL script is open in the editor, click "Connect", then go Options -> Additional Connection Parameters, and paste the connection string here. I also add "
;Database=DATABASENAME;
" to the end of the connection string. - Execute SQL
- Disconnect and restart Visual Studio
- Now the tables should be available in Server Explorer after expanding the tree control for the .mdf file.
Probably not all of the steps are required (especially not in the exact order shown above), as I've not really optimized the process -- if it works, don't fix it. :-) The one crucial step seems to be #8, i.e. restarting Visual Studio, because otherwise Server Explorer isn't able to reopen the database.
Thanks HighTechRider, the connection string created for the DataConnection in the server explorer did indeed have the "AttachDBFilename" parameter.
But this idea let me to try something else.
Following the same steps listed above I did something different at the log in to sqlexpress step. This time, in the Connect to Database Engine
screen, I clicked the show more options button and went to the "Additional Connection Parameter" tab.
In here i added AttachDBFilename=c:\src\mydatabasehome\Database1.mdf;database=Database1;
. Note I used the full path, not AttachDbFilename=|DataDirectory|\Database1.mdf
This then executed my sql against the database without an issue.
Then I went back to the server explorer and went to expand my database connection it so I could see my new tables, however the connection failed. After a bit of farting around, I worked out that for whatever reason, when I connected to the SQLExpress instance using the "Connect to Database Engine" screen the database file I specified in the AttachDBFilename actually made a permanent connection. Thus the previous connection string (using the AttachDBFilename parameter) was no longer valid as this database is already attached.
So I deleted that connection and created a new connection directly to the SQLServer which had a database in it named "database1" for me to select.
Now I think it has all worked out ok.
This is was a weird process, and certainly unexpected for me, so if anyone would like to explain what is going on I would certainly appreciate it. For now I have a way (even if a bit weird) of doing what I want, better solutions appreciated.
Hope this helps someone.
What does your connection string look like? Have you tried putting an AttachDbFilename
in the connection string?
Where is the "Additional Connection Parameter" tab? I only have and "Advanced" tab and it is not clear where you added the attach statement.
来源:https://stackoverflow.com/questions/2777963/ef4-generate-database