Это, вероятно, происходит потому, что хотя планировалось использовать поток Database First, на самом деле приложение использует Code First для отображения.Позвольте мне объяснить немного больше, потому что это может сбить с толку.: -)
При использовании Database First с EF Designer и шаблонами DbContext в Visual Studio происходят три очень важные вещи.Во-первых, новый мастер Entity Data Model добавляет строку подключения к вашему приложению, содержащую сведения о модели Database First (т.е. EDMX), чтобы при запуске приложения она могла найти эту модель.Строка подключения будет выглядеть примерно так:
<connectionStrings>
<add name="MyEntities"
connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=MyEntities;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Во-вторых, сгенерированный класс контекста выполняет вызов базового конструктора DbContext с указанием имени этой строки подключения:
public MyEntities()
: base("name=MyEntities")
{
}
Thisговорит DbContext найти и использовать строку подключения «MyEntities» в конфигурации.Использование «name =» означает, что DbContext сгенерирует, если не найдет строку подключения - он просто не будет создавать соединение по соглашению.
Если вы хотите сначала использовать базу данных, тоВы должны использовать строку подключения, такую как сгенерированная.В частности, он должен содержать данные модели (csdl, msl, ssdl из EDMX), и вы должны убедиться, что DbContext находит их.Будьте очень осторожны при изменении вызова базового конструктора.
Третье, что происходит, - это то, что OnModelCreating переопределяется в сгенерированном контексте и генерирует команду throw:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
Это сделано потому, чтоOnModelCreating вызывается только при использовании Code First.Это потому, что OnModelCreating - это все о создании модели, но когда вы используете Database First, модель уже существует - во время выполнения создавать нечего.Поэтому, если вызывается OnModelCreating, то это, вероятно, связано с тем, что вы начали использовать Code First без смысла, обычно из-за изменения строки подключения или обращения к базовому конструктору.
Теперь, возможно, вы захотитеиспользовать Code First для сопоставления с существующей базой данных.Это отличный шаблон, и он полностью поддерживается (см. http://blogs.msdn.com/b/adonet/archive/2011/03/07/when-is-code-first-not-code-first.aspx), но вам необходимо убедиться, что сопоставления настроены надлежащим образом, чтобы это работало. Если сопоставления настроены неправильно, вы получите исключения, подобные приведенному в этом вопросе..