Проблема с представлением о представлении с платформой Entity Framework 6 (сначала код) [дубликат]

Обратите внимание на тип возврата в определении approxCount.

def countApprox(
    timeout: Long,
    confidence: Double = 0.95): PartialResult[BoundedDouble] = withScope {

Теперь обратите внимание на то, как он используется:

val waitSecs = 60
val cnt = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).**getFinalValue**.mean

В соответствии с искровым scala doc, getFinalValue - метод блокировки, который означает, что он будет ждать завершения полной операции.

В то время как initialValue может быть выбран в течение указанного таймаута. Таким образом, следующий фрагмент не будет блокировать дальнейшие операции после таймаута,

val waitSecs = 60
val cnt = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).initialValue.mean

Обратите внимание, что недостатком использования countApprox(timeout, confidence).initialValue является то, что даже после получения значения он будет продолжать отсчет, пока он не получит окончательный счет, который вы

Теперь использование этого api не должно блокироваться при операции подсчета.

Ссылка: https://mail-archives.apache.org/mod_mbox/spark-user/201505.mbox/%3C747872034.1520543.1431544429083.JavaMail.yahoo@mail.yahoo.com%3E

Теперь давайте подтвердим наше предположение о неблокирующей операции на spark2-shell. Давайте создадим случайный фрейм данных и выполним count, approxCount с getFinalValue и approxCount с помощью initialValue:

scala> val schema = StructType((0 to 10).map(n => StructField(s"column_$n", StringType)))
schema: org.apache.spark.sql.types.StructType = StructType(StructField(column_0,StringType,true), StructField(column_1,StringType,true), StructField(column_2,StringType,true), StructField(column_3,StringType,true), StructField(column_4,StringType,true), StructField(column_5,StringType,true), StructField(column_6,StringType,true), StructField(column_7,StringType,true), StructField(column_8,StringType,true), StructField(column_9,StringType,true), StructField(column_10,StringType,true))

scala> val rows = spark.sparkContext.parallelize(Seq[Row](), 100).mapPartitions { _ => { Range(0, 100000).map(m => Row(schema.map(_ => Random.alphanumeric.filter(_.isLower).head.toString).toList: _*)).iterator } }
rows: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[1] at mapPartitions at :32

scala> val inputDf = spark.sqlContext.createDataFrame(rows, schema)
inputDf: org.apache.spark.sql.DataFrame = [column_0: string, column_1: string ... 9 more fields]

//Please note that cnt will be displayed only when all tasks are completed
scala> val cnt = inputDf.rdd.count
cnt: Long = 10000000

scala> val waitSecs = 60
waitSecs: Int = 60

//cntApproxFinal will be displayed only when all tasks are completed.
scala> val cntApprxFinal = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).getFinalValue.mean
[Stage 1:======================================================> (98 + 2) / 100]cntApprxFinal: Double = 1.0E7

scala> val waitSecs = 60
waitSecs: Int = 60

//Please note that cntApprxInitila in this case, will be displayed exactly after timeout duration. In this case 80 tasks were completed within timeout and it displayed the value of variable. Even after displaying the variable value, it continued will all the remaining tasks
scala> val cntApprxInitial = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).initialValue.mean
[Stage 2:============================================>           (80 + 4) / 100]cntApprxInitial: Double = 1.0E7

[Stage 2:=======================================================>(99 + 1) / 100]

Давайте посмотрим на искру ui и искровую оболочку, все 3 операции в то же время:

cntApprxInitial доступно до завершения всех задач.

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

223
задан Tyson Williams 1 June 2016 в 20:02
поделиться

27 ответов

Теперь это:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

в вашем файле YourDbContext.cs.

358
ответ дан Youngjae 23 August 2018 в 17:35
поделиться

Ни одно из этих решений не будет работать для нас (кроме отключения проверки схемы вообще). В итоге у нас был пропущенный матч в нашей версии Newtonsoft.json

. Наш AppConfig не получил правильное обновление:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

Решение состояло в том, чтобы исправить версию сборки до тот, который мы фактически развертывали

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>
0
ответ дан AcidPAT 23 August 2018 в 17:35
поделиться

Просто узнал ответ и подумал об обновлении здесь. Просто нужно сделать следующее.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}
19
ответ дан Ashish Gupta 23 August 2018 в 17:35
поделиться

Эта ошибка может указывать на проблему с вашей строкой подключения и соответствует ли ваше имя строки соединения декларации контекста базы данных.

У меня была эта ошибка, потому что я неправильно назвал локальную базу (глупая ошибка) и имя строки подключения в файле web.config «DefaultConnection» не соответствует MyDbContext, то есть

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>
0
ответ дан DanAbdn 23 August 2018 в 17:35
поделиться

Для разработчиков VB.NET:

Добавьте следующую строку в файл Glabal.asax.vb, в конце метода Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Измените ApplicationDbContext на ваш конкретный контекст Db.

3
ответ дан Eric Schneider 23 August 2018 в 17:35
поделиться

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

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }
1
ответ дан flobadob 23 August 2018 в 17:35
поделиться

На всякий случай у кого-то есть тот же сценарий, что и мой.

У меня есть база данных сначала EF и в то же время с использованием идентификатора asp.net

, поэтому у меня есть два connectionStrings в мой webconfig, и с этим нет никаких проблем. Случилось так, что я создал / запустил скрипты для генерации вручную таблиц идентификаторов asp.net, которых я не должен.

, поэтому DROP сначала создайте все идентификационные таблицы asp.net, созданные вами вручную / из скриптов.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers
1
ответ дан Francis Saul 23 August 2018 в 17:35
поделиться

Или вы можете поместить эту строку в свой файл Global.asax.cs в разделе Application_Start ():

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

Обязательно измените имя_проекта.Path.Context на свое пространство имен и контекст. Если сначала использовать код, это приведет к удалению и созданию новой базы данных всякий раз, когда будут внесены какие-либо изменения в схему.

16
ответ дан goodies4uall 23 August 2018 в 17:35
поделиться

У меня была та же проблема, когда мы использовали одну базу данных для двух приложений. Установка disableDatabaseInitialization="true" в разделе типа контекста работает для меня.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Подробнее https://msdn.microsoft.com/en-us/data /jj556606.aspx

1
ответ дан Julia Savinkova 23 August 2018 в 17:35
поделиться

Хорошее предложение, однако, было настолько точным во всех случаях. Я все понял. Пожалуйста, вам нужно убедиться, что вы запускаете «enable-migrations» с использованием окон PM в Visual Studio, а папка миграции будет добавлена ​​в ваш проект.

Убедитесь, что два файла класса c #, добавленные в папку на содержат все ваши модели и их соответствующие свойства.

Если у вас есть все, что создает решение, и публикация для развертывания.

Логика заключается в том, что существующие метаданные не могут быть перезаписаны, потому что ваше приложение не имеет метаданных для замены текущего. В результате вы получаете эту ошибку «Модель, поддерживающая контекст, изменилась с момента создания базы данных»

0
ответ дан Kay Ken 23 August 2018 в 17:35
поделиться

Это означает, что в контексте, который не был выполнен, произошли некоторые изменения. Сначала запустите Add-Migration, чтобы сгенерировать сделанные нами изменения (изменения, которые мы можем не знать), а затем запустить Update-Database

1
ответ дан Kerisnarendra 23 August 2018 в 17:35
поделиться

После некоторых исследований по этой теме я обнаружил, что ошибка возникает в основном, если у вас есть экземпляр db, созданный ранее на вашем локальном SQL-сервере express. Поэтому всякий раз, когда вы обновляете db и пытаетесь обновить db / run некоторый код на db, не выполнив команду Update Database, используя Package Manager Console; Прежде всего, вы должны удалить предыдущий db на нашем локальном SQL-Express вручную.

Кроме того, это решение работает, если у вас нет AutomaticMigrationsEnabled = false; в вашей конфигурации.

Если вы работаете с системой управления версиями (git, svn и т. д.), а некоторые другие разработчики обновляют объекты db на этапе производства, эта ошибка возрастает всякий раз, когда вы обновляете свою базу кода и запускаете приложение.

Как указано выше, для кода на основе кода есть некоторые решения. Однако в некоторых случаях это наиболее практично.

0
ответ дан Mahmut C 23 August 2018 в 17:35
поделиться

Это исправление больше не работает после CTP5.

Вы должны сделать Database.SetInitializer<YourContext>(null);

29
ответ дан Meenal 23 August 2018 в 17:35
поделиться

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

1) Откройте файл DbContext

2) Добавьте пространство имен с помощью Microsoft.AspNet .Identity.EntityFramework;

3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (новый DropCreateDatabaseAlways ()); }

-1
ответ дан Milan Goswami 23 August 2018 в 17:35
поделиться

Я читаю также книгу Pro ASP.NET MVC 4, и столкнулся с той же проблемой, с которой вы столкнулись. Для меня у меня возникла проблема после внесения изменений, предписанных в разделе «Добавление модели валидации» в книге. Как я решил проблему, переместив мою базу данных с localdb на полномасштабный сервер SQL Server 2012. (Кстати, я знаю, что мне повезло, что я могу переключиться на полномасштабную версию, так что не ненавидите меня. ;-))) Должно быть что-то с сообщением с db, которое вызывает проблему.

0
ответ дан MyJ3 23 August 2018 в 17:35
поделиться

Измените Global.asax.cs, включая событие Application_Start, с помощью:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
0
ответ дан p.campbell 23 August 2018 в 17:35
поделиться

Создать пользовательский инициализатор контекста:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

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

И зарегистрировать его из своего OmModelCreating:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}
0
ответ дан qub1n 23 August 2018 в 17:35
поделиться

Вот некоторая информация из Блог пользователя Scott Gu's , опубликованный Jeff о том, что на самом деле происходит:

Для тех, кто видит это исключение :

«Модель, поддерживающая контекст« Производство », изменилась с момента создания базы данных. Либо вручную удалите / обновите базу данных, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer

Вот что происходит и что с ним делать:

Когда модель сначала создается, мы запускаем DatabaseInitializer, чтобы делать что-то вроде создания базы данных, если ее нет или добавить данные семени. По умолчанию DatabaseInitializer пытается сравнить схему базы данных, необходимую для использования модели, с хешем схемы, хранящейся в таблице EdmMetadata, созданной с помощью базы данных (когда Code First является тем, который создает базу данных). Существующие базы данных не будут иметь таблицу EdmMetadata и поэтому не будут иметь хэш ... и реализация сегодня будет бросать, если эта таблица отсутствует. Мы будем работать над изменением этого поведения, прежде чем мы отправим версию fial, так как это значение по умолчанию. До тех пор существующие базы данных обычно не нуждаются в инициализаторе базы данных, поэтому его можно отключить для вашего типа контекста, вызвав:

Database.SetInitializer<YourDbContext>(null);

Jeff

125
ответ дан Randy 23 August 2018 в 17:35
поделиться

У меня была та же проблема: повторное добавление миграции и обновление базы данных не работало, и ни один из вышеперечисленных ответов не был прав. Затем меня поразило вдохновение - я использую несколько уровней (одна сеть, одна информация и один бизнес). Уровень данных имеет контекст и все модели. Веб-слой никогда не выбрасывал это исключение - это был бизнес-уровень (который я установил как консольное приложение для тестирования и отладки). Оказывается, бизнес-уровень не использовал правильную строку подключения, чтобы получить db и сделать контекст. Поэтому я добавил строку подключения в конфигурацию приложения бизнес-уровня (и слоя данных) и альта, который он работает. Поместите это здесь для других, которые могут столкнуться с одной и той же проблемой.

2
ответ дан Richard Barker 23 August 2018 в 17:35
поделиться

Для меня с обновлением до 4.3.1 я просто обрезаю таблицу EdmMetaData или просто удаляю ее прямо.

5
ответ дан Rob Koch 23 August 2018 в 17:35
поделиться

Я провел много дней, чтобы решить эту проблему, проанализировал много разных сообщений и попробовал много вариантов и, наконец, исправил. Это два проекта в моем решении с использованием первых миграций EF-кода:

  • Консольное приложение «DataModel», которое в основном используется как сборка, которая содержит все мои первые объекты кода, DbContext, Mirgations и общий репозиторий. Я включил в этот проект отдельный пустой файл локальной базы данных (в папке DataModel / App_Data), чтобы иметь возможность генерировать миграцию из консоли диспетчера пакетов.
  • WebApi, который ссылается на проект DataModel и использует файл локальной базы данных из папки WebApi / App_Data, который не включен в проект

. Я получил эту ошибку при запросе WebApi .. .

Моя среда:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional с обновлением 1
  • все мои проекты, предназначенные для .NET Framework 4.6.1
  • EntityFramework 6.1.3 из NuGet

Здесь я собрал все замечания, на которые вы должны обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:

  1. Вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
  2. База данных, созданная путем запуска последовательно всех сценариев миграции, должна иметь та же структура / схема, что и целевая база данных, и соответствует модели сущности. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу: весь ваш сценарий миграции до последнего текущего состояния модели первого объекта текущего кода (DbContext, entity) Целевая база данных
  3. Целевая база данных (файл mdf) должна обновляться / соответствуют последнему сценарию миграции. Убедитесь, что таблица «__MigrationHistory» в вашей целевой базе данных содержит записи для всех сценариев миграции, которые вы имеете, это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для генерации правильного кода первых сущностей и контекста, соответствующих вашей базе данных, Project -> Добавить новый элемент -> Модель данных Entity Data ADO.NET -> Код First из базы данных: Of Конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать модель вручную (код первых сущностей и контекста), а затем сгенерировать начальную миграцию и базу данных.
  4. Название строки подключения, например. MyConnectionString в файле конфигурации проекта запуска (Web.config / App.config):
    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    
    должен быть равен параметру, переданному в конструкторе вашего DbContext:
     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Перед использованием консоли диспетчера пакетов убедитесь, что что вы используете правильную базу данных для обновления или создания миграции, а необходимый проект задается в качестве запуска проекта решения. Для подключения к базе данных он будет использовать строку подключения из этого файла .config, который в проекте, который задан как проект запуска.
  6. И главное, что исправило мою проблему: это странно, но в моей папке WebApi / bin DataModel.exe был старым, а не обновлялся с момента последней сборки. Так как миграции были встроены в мою сборку DataModel.exe, то моя обновленная база данных WebApi использовала старые зеркала. Я был смущен, почему после обновления базы данных в WebApi он не соответствует последнему сценарию миграции из DataModel. Следующий код автоматически создает (если не существует) или обновляет последнюю локальную локальную миграцию в моей папке WebApi / App_Data.
       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    
    Я попробовал очистить и перестроить решение, но это не помогло, чем я полностью удалил папки bin и obj из WebApi, удалил файлы базы данных из WebApi / App_Data, создал, перезапустил WebApi, сделал запрос к нему, создал правильную базу данных - ленивый инициализация (используя строки выше), что соответствует последней миграции и исключению, больше не отображается. Таким образом, это может решить вашу проблему: удалите вручную bin, obj-папки из вашего проекта запуска (который генерирует / обновляет вашу базу данных), создайте ваш проект запуска или лучше очистите и перестройте все ваше решение. воссоздайте базу данных, запустив проект (выполнив строки выше) или воспользуйтесь командой «Обновление-база данных» диспетчера пакетов. вручную проверьте, соответствует ли сгенерированный db и __MirgationHistory последнему сценарию миграции.
7
ответ дан Sergey Kulgan 23 August 2018 в 17:35
поделиться

Просто запустите следующую SQL-команду в SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]
16
ответ дан Shafqat Ali 23 August 2018 в 17:35
поделиться

Попробуйте использовать Database SetInitializer, который принадлежит к использованию System.Data.Entity;

В Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Это создаст новую базу данных каждый раз, когда ваша модель будет изменена. Но ваша база данных будет пустой. Чтобы заполнить ее фиктивными данными, вы можете использовать Seeding. Который вы можете реализовать как:

Посев ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}
0
ответ дан SinghMavi 23 August 2018 в 17:35
поделиться

Проверьте следующие шаги

  1. Database.SetInitializer (null); -> in Global.asax.cs

2.

  1. ваше имя класса контекста должно совпадать с его проверкой
0
ответ дан Siva 23 August 2018 в 17:35
поделиться

У меня была эта проблема, и оказалось, что один проект указывал на SQLExpress, но тот, у кого проблема, указывал на LocalDb. (в их соответствующем web.config). Глупый надзор, но стоит отметить здесь, в случае, если кто-либо другой устранит эту проблему.

2
ответ дан stuartdotnet 23 August 2018 в 17:35
поделиться

Для Entity Framework 5.0.0.0 - 6.1.3

Вы действительно хотите сделать следующее:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

Да, Matt Frear верен. UPDATE -EDIT: Предостережение заключается в том, что я согласен с другими в том, что вместо добавления этого кода в global.asax добавлен в ваш класс DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code
}

. Как уже отмечалось, это хорошо для обработки модульного тестирования.

В настоящее время я использую это с Entity Framework 6.1.3 /.net 4.6.1

35
ответ дан Tom Stickel 23 August 2018 в 17:35
поделиться

Странно, но все ответы здесь бесполезны для меня. Для меня работал инициализатор

MigrateDatabaseToLatestVersion

Вот мое решение (я знаю, это может быть намного проще, но я его использую):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting просто наследует от DropCreateDatabaseAlways, поэтому в каком-то конкретном случае (тестирование) вся база данных перестраивается. В противном случае он переносится в последнюю версию.

Мой источник: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

0
ответ дан Tomino 23 August 2018 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: