none
Баг при переходе от Entity Framework 4.0 к Entity Framework 5.0 RRS feed

  • Вопрос

  • Исходная ситуация

    Имеем работающий проект использующий в качестве Data Access Level (DAL) Framework 4.0.

    База данных SQL 2000 (возможно это важно), для выборки данных активно используются VIEW.

    В модельной ситуации проблема выглядит следующим образом

    Имеется тестовая таблица в два поля

    CREATE TABLE [TEST_TABLE]

    (

                    [ID]   [int] IDENTITY(1, 1) NOT NULL,

                    [ID1]  [int] NOT NULL,

                    CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED([ID]) ON [PRIMARY]

    ) ON [PRIMARY]

    На основе этой таблицы создается простейшее VIEW в одно поле

    CREATE VIEW dbo.TEST_TABLE_VW

    AS

    SELECT ID

    FROM   dbo.TEST_TABLE

    Заполняем таблицу данными (1,2,3)

    Создаем тестовый проект (Console Application) с Entity Framework 4.0 (подключаем через references)

    Тестовый класс

    public class TestTable

        {

            public int Id { get; set; }

        }

    }

    Выполняем через Code First mapping на таблицу

    internal TableMaping()

            {  this.ToTable("TEST_TABLE");

                this.HasKey(row => row.Id);

                this.Property(row => row.Id).HasColumnName("ID");

             }

    Создаём  DBContext, выполняем запрос

           var row = context.TeasTableRows.Find(id);

    Все работает

    Заменяем в mapping  таблицу на VIEW

     this.ToTable("TEST_TABLE_VW");

    Повторно выполняем запрос. Все работает

    Переходим к Entity Framework 5.0

    Создаем аналогичный проект, Entity Framework 5.0 (согласно рекомендации) подключаем через NuGet

    Выполняем  mapping на таблицу

    this.ToTable("TEST_TABLE");

    выполняем запрос

           var row = context.TeasTableRows.Find(id);

    Все работает

    Заменяем в mapping  таблицу на VIEW

    this.ToTable("TEST_TABLE_VW");

    выполняем запрос и получаем Exception

    System.FormatException was unhandled

      HResult=-2146233033

      Message=Входная строка имела неверный формат.

      Source=mscorlib

      StackTrace:

           в System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

           в System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)

           в System.Convert.ToInt32(String value)

           в System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildColumnModel(XElement property, String entitySetName, ModelMetadata modelMetadata)

           в System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass125.<BuildCreateTableOperation>b__123(XElement p)

           в System.Data.Entity.Migrations.Extensions.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)

           в System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildCreateTableOperation(String entitySetName, String tableName, String schema, ModelMetadata modelMetadata)

           в System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<FindAddedTables>b__31(XElement es)

           в System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

           в System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)

           в System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

           в System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, String connectionString)

           в System.Data.Entity.Migrations.History.HistoryRepository.CreateCreateTableOperation[TContext](Func`2 createContext, ModelDiffer modelDiffer)

           в System.Data.Entity.Migrations.History.HistoryRepository.CreateCreateTableOperation(ModelDiffer modelDiffer)

           в System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto)

           в System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)

           в System.Data.Entity.Migrations.Infrastructure.MigratorBase.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)

           в System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)

           в System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)

           в System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)

           в System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()

           в System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)

           в System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext)

           в System.Data.Entity.Database.Create(Boolean skipExistsCheck)

           в System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context)

           в System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6()

           в System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)

           в System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()

           в System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)

           в System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)

           в System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)

           в System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()

           в System.Data.Entity.Internal.InternalContext.Initialize()

           в System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)

           в System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()

           в System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()

           в System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues)

           в System.Data.Entity.DbSet`1.Find(Object[] keyValues)

           в Debug_Entity4.Program.Main(String[] args) в c:\VS 2012\Debug Entity5\Debug Entity4\Program.cs:строка 15

           в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

           в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

           в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

           в System.Threading.ThreadHelper.ThreadStart_Context(Object state)

           в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

           в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

           в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

           в System.Threading.ThreadHelper.ThreadStart()

       

Ответы

  • Eureka!
    Thank you very much for the advice
    You must explicitly specify when creating DBContext

    Database.SetInitializer <T> (null);

    Everything works!

    I should note, the use of this statement is required when used for mapping VIEW.
    When using this mapping on TABLE statement can be omitted
    It's weird and unpredictably
    • Предложено в качестве ответа Naomi N 28 мая 2013 г. 18:07
    • Помечено в качестве ответа Yuri Kelberg 28 мая 2013 г. 18:07
  • Решение найдено
    Большое спасибо за совет Naomi N
    Необходимо явно указать при создани DBContext

    Database.SetInitializer<T>(null);

    Все работает!

    Должен отметить, использование этого утверждения необходимо при использовании mapping на VIEW.
    При использовании mapping на TABLЕ этот оператор можно опустить
    Это странно и неочевидно

    Наверно это все таки баг, и следует сообщить Microsoft, но я пока не знаю как

    • Помечено в качестве ответа Yuri Kelberg 28 мая 2013 г. 18:07
  • Here is where you can post any issues and bugs for EF:

    http://entityframework.codeplex.com/workitem/list/basic

    I know I also posted an issue once but later it turned out to be my own problem, not the EF code problem.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

Все ответы

  • А вы пробовали тоже самое на новых версиях серевера SQL, ошибка повторяется? Вот только никак не могу найти официальной информации о поддержке версий SQL Server.
    • Предложено в качестве ответа Naomi N 28 мая 2013 г. 14:23
    Модератор
  • Пока не пробовал, смысла особого нет, потому что стоит задача работать именно с сервером SQL 2000 (действующий  проект). Поддержку SQL 200 никто ине отменял.

     Обидно, что с Entity Framework 4.0 все работает,  а вот с Entity Framework 5.0-отлет

  • Здравствуйте,

    Если не ошибаюсь SQL 2000 уже в Апреле перестал поддерживаться. Не думаю что он есть в EF 5.0


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    • Предложено в качестве ответа Naomi N 28 мая 2013 г. 14:21
    Модератор
  • Can you run SQL Profiler to see what commands are being send to SQL Server by EF?

    But basically I agree with Maksim - you're using old unsupported version of SQL Server - don't be surprised if it's not supported by latest EF version.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Тут интересная поблема состоит в том, что mapping на таблицу (EF5) выполняется без ошибок, а на VIEW простейшей схемы- отлет (см выше описание тестового примера).

    В  (EF4)  проблем нет

    Я не видел никаких предупреждений, о том что  (EF5) не совместим с SQL 2000. Это было очень странно для Miicrosoft, ведь  (EF5) работет с Oracle и другми базами

    Мне кажется, что это баг при чтении метаданных VIEW  из базы SQL 2000

  • Yes, I have used, but I can not understand where is the problem here.

    This is a log of SQL Profiler

    ----------------------------------------------------------------------------

    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 12 0 0 7900 53 2013-05-28 19:27:39.073 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.073 
    SQL:BatchCompleted SELECT TABLE_SCHEMA SchemaName, TABLE_NAME Name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' EntityFrameworkMUE  SKAP_DBA 16 6129 0 16 7900 52 2013-05-28 19:27:39.073 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.260 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 15 8 0 16 7900 53 2013-05-28 19:27:39.260 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.340 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:39.340 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.433 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 52 2013-05-28 19:27:39.433 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.543 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:39.543 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.560 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 52 2013-05-28 19:27:39.560 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.637 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:39.637 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.637 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 52 2013-05-28 19:27:39.637 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.713 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:39.713 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.730 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 52 2013-05-28 19:27:39.730 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:39.870 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:39.870 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:39.870 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 16 8 0 16 7900 52 2013-05-28 19:27:39.870 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 53 2013-05-28 19:27:40.010 
    SQL:BatchCompleted SELECT Count(*) FROM sysdatabases WHERE [name]=N'SKAP_SPB' EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 53 2013-05-28 19:27:40.010 
    RPC:Completed exec sp_reset_connection EntityFrameworkMUE  SKAP_DBA 0 0 0 0 7900 52 2013-05-28 19:27:40.010 
    SQL:BatchCompleted SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1] EntityFrameworkMUE  SKAP_DBA 0 8 0 0 7900 52 2013-05-28 19:27:40.010 
    Audit Logout  EntityFrameworkMUE  SKAP_DBA 5734 83 0 3043 7900 53 2013-05-28 19:27:39.060 
    Audit Logout  EntityFrameworkMUE  SKAP_DBA 13063 6200 0 3343 7900 52 2013-05-28 19:27:38.777 

  • It is not clear to me where may be an error - hard to see in that log. I can only suggest to try running these exact statements in SQL Server 2000 one by one and see if you get any errors.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Thanks for the advice
    When using a mapping to VIEW statement in error

    SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
     COUNT(1) AS [A1]
     FROM [dbo].[__MigrationHistory] AS [Extent1]
    )  AS [GroupBy1]

    Error is

    Invalid object name 'dbo.__MigrationHistory'.

    When using a mapping to TABLE no errors

  • Where this dbo._MigrationHistory is coming from? Is it a name of the view? 

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Eureka!
    Thank you very much for the advice
    You must explicitly specify when creating DBContext

    Database.SetInitializer <T> (null);

    Everything works!

    I should note, the use of this statement is required when used for mapping VIEW.
    When using this mapping on TABLE statement can be omitted
    It's weird and unpredictably
    • Предложено в качестве ответа Naomi N 28 мая 2013 г. 18:07
    • Помечено в качестве ответа Yuri Kelberg 28 мая 2013 г. 18:07
  • Решение найдено
    Большое спасибо за совет Naomi N
    Необходимо явно указать при создани DBContext

    Database.SetInitializer<T>(null);

    Все работает!

    Должен отметить, использование этого утверждения необходимо при использовании mapping на VIEW.
    При использовании mapping на TABLЕ этот оператор можно опустить
    Это странно и неочевидно

    Наверно это все таки баг, и следует сообщить Microsoft, но я пока не знаю как

    • Помечено в качестве ответа Yuri Kelberg 28 мая 2013 г. 18:07
  • Here is where you can post any issues and bugs for EF:

    http://entityframework.codeplex.com/workitem/list/basic

    I know I also posted an issue once but later it turned out to be my own problem, not the EF code problem.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog