Entity Framework Code First в библиотеке классов - PullRequest
4 голосов
/ 25 декабря 2011

Я только что начал пробовать свои силы на коде EF4 этим утром и создал свои классы POCO, контекст данных и классы Initializer в отдельной библиотеке классов, я считаю, что это обычный код типа котельной пластины.Я ссылаюсь на класс в приложении MVC3 и устанавливаю инициализатор в Global.asax.При запуске приложения я замечаю следующие проблемы
1. База данных нигде не создается (затем я добавляю запись в web.config для строки подключения, названной в честь класса Context, но по-прежнему ничего не получается)
2.Когда я пытаюсь получить доступ к инициализированным значениям, я получаю нулевую ошибку, очевидно, из-за отсутствия данных.

Может кто-нибудь, пожалуйста, помогите мне с указателями о том, как заставить это работать (было бы стыдно, если бы яЯ потратил на изучение всего этого Рождество, и я до сих пор не могу заставить его работать :() Спасибо
ps. Я попытался вставить точки останова, и я нажал на метод инициализации приложения, но он никогда не попадает в метод Seed в инициализаторе, хотяТакже я добавляю точку останова !!
Спасибо.
Класс инициализатора

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Entity;
    using F2AController.Models;

    namespace F2AController.DataObjects
    {
        public class F2AInitializer : DropCreateDatabaseAlways<F2AContext>
        {
            protected override void Seed(F2AContext context)
            {
                var countries = new List<Country> 
                {
                    new Country(){ CountryName="Germany", Active = true},
                    new Country(){ CountryName="Britain", Active = true}
                };
                countries.ForEach(s => context.Countries.Add(s));
                context.SaveChanges();
                var providers = new List<Providers>() 
                {
                    new Providers(){ ProviderName="InfoBip", ContactDetails="Rturo Manovic", Active=true, MessageRates= new List<ProviderRates>(){new ProviderRates(){ CountryId=1, DateCreated=DateTime.Now, DateModified=DateTime.Now, Rate=0.05M, Active=true}}}
                };
                providers.ForEach(p => context.Providers.Add(p));
                context.SaveChanges();
                var usermobiles = new List<MobileTerminal>()
                {
                    new MobileTerminal(){ Active= true, Credits=200, DateCreated=DateTime.Now, MSISDN="4477565444865"}
                };
                usermobiles.ForEach(u => context.MobileTerminals.Add(u));

                context.SaveChanges();
            }


        }
    }

Контекстный класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace F2AController.Models
{
    public class F2AContext : DbContext
    {
        public DbSet<Country> Countries;
        public DbSet<MobileTerminal> MobileTerminals;
        public DbSet<Providers> Providers;
        public DbSet<ProviderRates> ProviderRates;
        public DbSet<Property> Properties;
        public DbSet<ShortMessage> ShortMessages;
        public DbSet<UserProperties> UserProperties;

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
}

Global.asax Метод инициализации приложения

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["F2AContext"].ConnectionString);
        Database.SetInitializer<F2AContext>(new F2AInitializer());

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

Ответы [ 3 ]

4 голосов
/ 27 декабря 2011

Eureka..finally!
При поиске решения я наткнулся на этот пост База данных Entity Framework. SetInitializer просто не работает
Применение предложенного решения заставило мою базу данных создатьработал при запуске, как я и ожидал, но затем при запуске начального кода он выдал исключение нулевого указателя.В ходе исследования я понял, что любая попытка ссылаться на коллекции DBSet из класса Context приводила к тому же исключению.Осмотрев далее, я понял, что вместо использования

 public DbSet<MobileTerminal> MobileTerminals { get; set; }

я использовал

   public DbSet<MobileTerminal> MobileTerminals;

Что означало, что я не получил никакой неявной инициализации объекта, отсюда исключение нулевого указателя.Я удалил код принудительной инициализации и снова запустил приложение, на этот раз начальный код не работал, пока я не получил доступ к странице, которая фактически запрашивала контекст данных, и он работал отлично.
По-видимому, из-за отложенной загрузки код инициализациине запускается до тех пор, пока он действительно не понадобится, т. е. при первом запросе контекста данных в приложении.

Надеюсь, это поможет любому, кто столкнется с такой же проблемой в будущем.

1 голос
/ 11 марта 2014

Я хотел поделиться еще одной проблемой, когда сначала использовал библиотеку классов для кода, и наткнулся на этот пост. У меня был свой код, сначала классы POCO и DataContext в библиотечном проекте, и я хотел использовать этот проект для создания своей базы данных сначала кода. Я выяснил, что существует флаг -ProjectName, с помощью которого можно указать проект библиотеки классов, который нужно искать при создании базы данных.

   add-migration -Name 'InitialCreate' -ProjectName 'MyProject.Data'

   update-database -ProjectName 'MyProject.Data'  
0 голосов
/ 27 декабря 2011

Возможно, проблема связана со строкой соединения, которую вы используете в файле web.config.

Для SQL CE используйте следующее

<add name="YourContext"
  connectionString="Data Source=|DataDirectory|yourDB.sdf"
  providerName="System.Data.SqlServerCe.4.0"/>

Для SQL Express используйте следующее

<add name="YourContext"
     connectionString="Data source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=YourDatabase;" 
     providerName="System.Data.SqlClient" />

Полагаю, это должно заставить все работать.

Кроме того, я думаю, вам стоит взглянуть на эту статью Код EF Первая инициализация БД с помощью Web.Config .Лучше инициализировать базу данных из файла web.config, а не из файла global.asax

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