MVC3 code-first-EF4.1 не создает таблицы автоматически (используя MySQL и Connector / Net 6.3.6.) - PullRequest
4 голосов
/ 13 июня 2011

EF 4.1 вместе с MySQL и Connector / Net 6.3.6 не создает таблицы автоматически на основе моих объектов POCO.Я не уверен, что у меня неправильная конфигурация или Connector / .Net 6.3.6 просто не поддерживает эту функцию.Я сканировал Интернет в течение недели, не находя ответа, и я думаю, что я рассмотрел все вопросы EF и MySQL здесь в stackoverflow.Я заметил, что многие посты относятся к dotConnect (например, Проблемы с использованием кода EF4.1 Сначала с MVC3 и MySQL ), но мне нужно найти бесплатное решение.Я настроил проверку подлинности с помощью форм, и это прекрасно работает с поставщиками MySQL, но мне пришлось создавать схему базы данных и таблицы вручную.

Я настроил свой проект следующим образом.Части моего файла web.config.

<connectionStrings>
    <add name="MySQLConn" connectionString="Server=localhost;Database=XxX;Uid=xXx;Pwd=xXx;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

    <profile defaultProvider="MySqlProfileProvider" enabled="true">
        <providers>
            <clear />
            <add name="MySqlProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" connectionStringName="MySQLConn" applicationName="/" />
        </providers>
    </profile>

    <roleManager enabled="true" defaultProvider="MySqlRoleProvider">
        <providers>
            <clear />
            <add name="MySqlRoleProvider" type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" connectionStringName="MySQLConn" applicationName="/" />
        </providers>

<system.data>
    <DbProviderFactories>
        <clear />
        <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>

Мои объекты POCO:

[XmlRoot(ElementName = "Shop", IsNullable = false)]
[Table("shops")]
public class ShopModel
{
    [Key]
    public int Id { get; set; }

    // must be unique
    [Required]
    public string Name { get; set; }

    public string SiteUrl { get; set; }

    public string LogoUrl { get; set; }

    public string AffiliateSuffix { get; set; }

    public virtual ICollection<ProductModel> ProductModels { get; set; }
}

    [XmlRoot(ElementName = "Product", IsNullable = false)]
[Table("products")]
public class ProductModel
{
    [Key]
    public int Id { get; set; }

    [Required] 
    public string Title { get; set; }

    [Required] 
    public decimal Price { get; set; }

    public string ImageUrl { get; set; }

    public string ProductUrl { get; set; }

    [Required]
    public virtual ShopModel ShopModel { get; set; }
}

Мой DBContext

    public class MySQLConn : DbContext
{
    public DbSet<ShopModel> Shops { get; set; }
    public DbSet<ProductModel> Products { get; set; }
}

Я создал фиктивный класс, который создает новый магазин и новый объект Product, например, ctx.Shops.Add (new ShopModel {...});ctx.Savechanges ();// код останавливается здесь

Когда я запускаю свой код, я получаю следующую ошибку:

Таблица 'имя_символа' не существует

Описание: Anнеобработанное исключение произошло во время выполнения текущего веб-запроса.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: MySql.Data.MySqlClient.MySqlException: таблица «имя-схемы.шопов» не существует

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

Я нашел решение этой проблемы.Вы должны получить последнюю версию Connector / NET 6.4.4.Добавьте инициализатор базы данных.Добавьте Persist Security Info = true в строку подключения.Я сделал все это, и мой работает отлично.

Также заметил, что если у вас уже есть база данных, EF может выдать вам исключение EntityDataModel.Возможно, вам придется вручную удалить предыдущую базу данных, прежде чем EF автоматически создаст и базу данных, и таблицы.С тех пор любые изменения, которые вы вносите в свои модели, и DBContext автоматически отражаются в базе данных.

0 голосов
/ 18 февраля 2014

MySql Connector / NET не поддерживал Entity Framework Code First до версии 6.6 (В настоящее время подойдет любой из 6.6.6, 6.7.4 или 6.8.3).

0 голосов
/ 28 июня 2011

Вы пробовали это с помощью SQL Express, чтобы увидеть, если вы получаете ту же ошибку?

Вы пытались создать инициализатор базы данных?Класс будет объявлен как код ниже.Пусть он запустит таблицу со значениями.

public class MySQLConnInitializer : DropCreateDatabaseIfModelChanges<MySQLConn>

Затем в Global.asax.cs вы добавите следующую строку:

Database.SetInitializer<MySQLConn>(new MySQLConnInitializer ());
...