Проблема подключения к базе данных с MVC3 - PullRequest
2 голосов
/ 10 сентября 2011

Я использую MVC3 с подходом Code first. В этом случае мне пришлось генерировать классы сущностей из существующей базы данных.

База данных была

Database1.mdf

Как только я это сделал, он создал DBEntities и добавил новую строку подключения в мой Web.config, которая выглядела примерно так:

<add name="DATABASE1Entities" connectionString="metadata=res://*/Models.Task.csdl|res://*/Models.Task.ssdl|res://*/Models.Task.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\DATABASE1.MDF;integrated security=True;user instance=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Теперь я удалил сущности БД и создал собственный класс контекста БД.

и

Теперь я работаю со следующей строкой соединения:

<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|DATABASE1.mdf;User Instance=true" providerName="System.Data.SqlClient" />

Имя моего класса DBcontext - TaskContext.

Я не уверен, что случилось после этого. Мой код работает. Но он работает на некоторой пустой базе данных и не отражает никаких данных в database.mdf. Если я добавляю что-то с помощью моего контроллера, то вижу, что это добавлено. Но это не отражается в Databse1.mdf.

Кажется, он создал свою собственную базу данных. Но я не вижу ни одного файла .sdf или .mdf, созданного нигде .... Я не уверен, что происходит?

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

Сделайте имя вашей строки подключения таким же, как TaskContext:

<add name="TaskContext" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|DATABASE1.mdf;User Instance=true" 
    providerName="System.Data.SqlClient" />

ИЛИ , вы можете использовать свой любимый connectionStringName , выполнив следующие действия:

1- Когда вы создаете объект TaskContext, изменяется его connectionString :

var cn = WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
// or
var cn = WebConfigurationManager.ConnectionStrings[0].ConnectionString; // use your connection index instead of 0
var _context = new TaskContext();
_context.Database.Connection.ConnectionString = cn;

2- в вашем контексте класса (TaskContext), вы должны указать modelBuilder , чтобы удалить IncludeMetadataConvention по этому коду:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    base.OnModelCreating(modelBuilder);
}
2 голосов
/ 11 сентября 2011

Попробуйте сделать имя вашей строки подключения и DBContext одинаковыми.Я полагаю, что в какой-то момент, читая, что EF Code First использует много соглашений, поэтому, если он не найдет строку подключения, называемую контекстом БД (в вашем случае «TaskContext»), он попытается подключиться к SQLExpress (независимо от того, является ли онон установлен) и попытается найти или создать базу данных.

Я предполагаю, что у вас установлен SQLExpress.Что в C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\?(Я думаю, что это путь) У вас есть БД, сидящая там для этого проекта?Может быть, что-то вроде [YourNamespace] .TaskContext.dbf?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...