DbContext Отображения таблиц - PullRequest
3 голосов
/ 04 марта 2012

Я пытался реализовать этот сценарий .Я создал модель Code First, затем сгенерировал базу данных sql из модели и создал ручные миграции через MigSharp .После этого я добавил код в OnModelCreating для обновления сопоставлений.

protected  void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>().ToTable("dfg_Product");
  modelBuilder.Entity<Customer>().ToTable("dfg_Customer");
}

Проблема в том, что DbContext все еще пытается получить данные из сопоставлений по умолчанию "dbo.Product | dbo.Customer", и мне нужно изменить сопоставленияна "dbo.dfg_Product | dbo.dfg_Customer".Я пытался отладить, но код в OnModelCreating не вызывается.

Пожалуйста, помогите, что я делаю не так?

РЕДАКТИРОВАТЬ: Добавлена ​​строка подключения

<add name="DataModelContainer" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/‌​DataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost\SQLEXPRESS;initial catalog=TestDB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Проблема была решена путем изменения строки подключения на:

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

1 Ответ

5 голосов
/ 04 марта 2012

Если вы выполняли свое приложение ранее, и ваша модель остается прежней, база данных уже существует, и OnModelCreating() не будет вызван.

Вы можете использовать Database.SetInitializer()

static void Main(string[] args)
{
     Database.SetInitializer(
            new DropCreateDatabaseIfModelChanges<YourContext>());
     //or
     Database.SetInitializer(
            new DropCreateDatabaseAlways<YourContext>());
     //your code
}

Также я заметил, что вы используете FluentAPI и хочу отметить, что вы также можете использовать атрибуты для сопоставлений:

[Table("dfg_Product")]
public class Product

Надеюсь, это поможет.

EDIT:

Вы используете

modelBuilder.Entity<Product>().ToTable("dfg_Product");

и именно поэтому он создал dbo.Product. Используйте

modelBuilder.Entity<Product>().MapSingleType().ToTable("dfg_Product");

и, пожалуйста, используйте DropCreateDatabaseAlways(), чтобы вы получили новую базу данных с правильными сопоставлениями.

РЕДАКТИРОВАТЬ 2

Вам не нужна информация метаданных в строке подключения при разработке приложения Code First, поэтому строка подключения должна выглядеть следующим образом:

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...