Entity Framework 4.1 Дерекқор жасалынғаннан кейін контекстті қолдайтын үлгі дереу DB жасағаннан кейін өзгерді

Мен деректер базасына әртүрлі нысандарды сақтау үшін Entity Framework 4.1 пайдаланатын жобада жұмыс істеймін (алдымен код).

Мен Visual Studio бағдарламасында жергілікті SQL Express DB-мен тестілеуден өтіп жатырмыз және біздің Jenkins серверіміз тестілеу серверіне сәйкес кодты енгізеді. Мұндай жағдай орын алса, мен жергілікті байланыс жолын уақытша тестілеуді DB серверіне бағыттап, сынақ деректер базасын қайта құру үшін бірліктерді тестілеуді уақытша өзгертуге тырысамын.

Мен жақында біздің тестілік серверіміз осы қателікті көрсеткенін байқадым:

Дерекқор жасалғаннан бері 'EntityFrameworkUnitOfWork' контекстіне қолдау көрсететін үлгі өзгерді. Дерекқорды қолмен жойып/жаңартыңыз немесе ID DatabaseInitializer данасымен Database.SetInitializer-қа қоңырау шалыңыз. Мысалы, DropCreateDatabaseIfModelChanges стратегиясы дерекқорды автоматты түрде жояды және жаңартады және оны міндетті түрде жаңа деректермен ұрлайды.

Бұл, әдетте, біздің кодын өзгерткенін көрсетеді және дерекқорды қайта құру үшін бірлік сынағын іске қосу керек. Мен бұны қоспағанда ғана! Біздің орналастыру процесінде дұрыс емес нәрсе бар деп ойламаймын - тестілік сервердегі DLL-лер менің жергілікті ортаңыздағы сияқты нұсқалар. Дерекқор жасағаннан кейін өзгерген модель туралы осы қатеге әкелетін басқа параметрлер немесе қоршаған ортаның факторлары бар ма?

Мен мұнда жаңадан шықтым - кез келген көмек үшін алғыс айтамын!

25
ModelHash бағдарламасын алу үшін System.Data.Entity.Infrastructure.EdmMetadata.TryGetModelHas & zwnj; h (YourDbContext) әдісін қолданып, оларды жергілікті компьютерде және тестерлерде әртүрлі ма екенін көруге тырысыңыз ба?
қосылды автор Marc, көзі
Деректер базасын қалпына келтіргеннен кейін контекстті немесе POCO-ды қалпына келтіру үшін теңшеу құралын іске қостыңыз ба?
қосылды автор radu florescu, көзі
@Marc Иә, хэштер басқаша көрінеді.
қосылды автор DaveBeta, көзі
@ Floradu88 100% емес, сіз нені білдіреді. Мен Database.SetInitializer-ді DropCreateDatabase арқылы DBContext-ді DB-ны жаңғырту үшін қолдандым. Менің ойымша, бұл POCO болар еді?
қосылды автор DaveBeta, көзі

7 жауаптар

Көрген қате, EdmMetadata </​​code> кестесінде сақталған үлгі хэштегі бағдарламаның үлгісінен есептелген модель хешінен өзгеше екенін білдіреді. Себебі сіз дерекқор жасауды басқа бағдарламадан (сіздің қосымшаңызды) іске қосып жатсаңыз, олардың екеуі ерекшеленуі мүмкін. Мұнда қарапайым кеңестер: деректер базасын құру үшін әртүрлі қолданбаларды қолданбаңыз және орнына негізгі бағдарламаңызды дерекқорды (автоматты түрде немесе кейбір әкімші интерфейсімен) жасаңыз.

Басқа нұсқа ретінде бұл тексеруді жауапты конвенцияны алып тастау арқылы бұл тексеруді толығымен өшіруіңізге болады:

modelBuilder.Conventions.Remove();

Үлгі хешті есептеу сіздің қолданбаңыздағы ағымдағы элементтерге (әр түрлі модельдік хэштегі қарапайым өзгерістердің нәтижесі) және дерекқор сервері нұсқаларына/манифестіне байланысты. Мысалы, 2005 және 2008 SQL серверінде орналастырылған үлгі әртүрлі модельдік хэштерге ие болады (Экспресс-Толық немесе 2008-ден 2008 R2-ге дейін әртүрлі модельдік хэштер болмауы керек).

25
қосылды
@ppumkin: Жауап EF4.3 алдында маңызды болды
қосылды автор Ladislav Mrnka, көзі
Warning 2 'System.Data.Entity.Infrastructure.IncludeMetadata & zwnj; Convention' ескірген: 'IncludeMetadataConvention енді қолданылмайды. EdmMetadata үлгіге кірмейді. енді үлгідегі өзгерістерді анықтау үшін қолданылады. ' 2013 Жауап EF4-де бұдан әрі маңызды емес
қосылды автор ppumkin, көзі
Кез келген адам EF5.0 немесе Database/Model алғашқы сценарийлеріне жаңарту алды ма? (осы сұраққа ұқсас stackoverflow.com/questions/16459047/… )
қосылды автор Dave A-W, көзі
Бізде жұмыс үстелі мен серверде әртүрлі OS нұсқасы бар және бізде SQL Server-дің бірнеше нұсқасы бар, себебі SQL Express-ды жергілікті түрде пайдаланамын, бірақ UAT-де емес. Егер оның тұжырымдық айырмашылықтары басқа EdmMetadata </​​code> хэштерін тудыратын өмір фактісі болса, мен конгресті алып тастау арқылы хэш жасауды/тексеруді өшіруге қуаныштымын. Рахмет!
қосылды автор DaveBeta, көзі

Бұл әртүрлі платформалардағы айырмашылықтарды реттеудің көрінісіне байланысты болуы мүмкін. Тексеру үшін EdmxWriter API бағдарламасын EDMX екеуін де орталармен салыстыру үшін пайдалануға болады. Егер кестелердің кез-келгені әртүрлі бағандарға тапсырыс берсе, бұл мәселе.

Шешіп өту үшін, сынақ дерекқорыңыз жаңартылған сияқты сіздің жергілікті серверден гөрі, сіздің сынақ серверінен жаңартылып отырады.

Біз бұл мәселені келесі шығарылымда түзетеміз.

9
қосылды
Бұл теңшелімге негізделген айырмашылық болуы мүмкін бе? яғни отладка босату және т.б.
қосылды автор JarrettV, көзі

Код-бірінші тәсілде SSDL кодты орындау кезінде жасалады. Жасалған SSDL-дегі ақпараттың бірі - DbConnection-те қолданылатын провайдердің аты. Сіз айтып кеткендей, сіз әр түрлі дерекқорлар қозғалтқыштарына қосыласыз, сондықтан сіз екі түрлі провайдерлерді пайдалануыңыз керек. Бұл хэширлеу функциясының нәтижесін толықтай өзгертеді.

Төмендегі код EntityFramework жинағынан алынған:

using (XmlWriter writer = XmlWriter.Create(output, settings))
{
    new SsdlSerializer().Serialize(database, providerInfo.ProviderInvariantName, providerInfo.ProviderManifestToken, writer);
}
6
қосылды
Провайдер өзгергеннен емес, отлад пен босату арасындағы айырмашылықты көріп отырмын
қосылды автор JarrettV, көзі
Бұл менің сұрағыма жауап бермегенімен, ол бастапқы сұраққа жауап береді. Міне, сіздің сый-тартуыңыз.
қосылды автор JarrettV, көзі

This might help and the link to Scott G blog will sure be a solution to your problem check this question link

Edit 1: this is the link to Scott G blog

2 түзету: Сіз бұл егер дерекқорды бірінші кезекте интеграция серверінде пайдалансаңыз

Edit 3: Бұл Толығырақ егжей-тегжейлі жауап> Скотт Г.

3
қосылды
@Қазіргісі бар жігіт: Сіз жауапты тексеруге тырыстыңыз ба?
қосылды автор radu florescu, көзі

Қолданбаңызды әртүрлі операциялық жүйелермен (немесе қызметтік бумалармен) іске қосатын екі серверлер бар ма? Пайдаланылатын SHA256CryptoService, PlatformNotSupportedException дегенді басқа әдіске көшіруге әкеліп соғуы мүмкін.

http://msdn.microsoft.com/kz -us/library/system.security.cryptography.sha256cryptoserviceprovider.sha256cryptoserviceprovider.aspx

// System.Data.Entity.Internal.CodeFirstCachedMetadataWorkspace
private static SHA256 GetSha256HashAlgorithm()
{
  SHA256 result;
  try
  {
    result = new SHA256CryptoServiceProvider();
  }
  catch (PlatformNotSupportedException)
  {
    result = new SHA256Managed();
  }
  return result;
}

Мұны әрбір серверде келесі 2 (ішкі/жеке) әдістерді енгізу үшін көрсету арқылы көрсетуіңізге болады.

MetaDataWorkspace.ToMetadataWorkspace(DbDatabaseMapping, Action)
CodeFirstCachedMetadataWorkspace.ComputeSha256Hash(string xml);
3
қосылды
Бұл нәтиже беретін басқарылатын нұсқаға қайтарылады.
қосылды автор JarrettV, көзі

Entity Framewнемесеk коды алдымен EdmMetadata деп аталатын кестені жасайды. Ол сіздің ағымдағы үлгіңізді сақтайды. Бағдарламаны іске қосқаннан кейін, EF қолданылатын модель db «білетін» модельмен бірдей екенін тексереді.

Дерекқор тасымалын орындағыңыз келсе, мен EF кодын бірінші көшіру , бірақ ол әлі альфа болып табылады.

Көшіруді пайдаланғыңыз келмесе:

схеманы қолмен өзгертуге болады - бұл EdmMetadata кестесінің мазмұнын сынақ серверіне барлық өзгертулермен бірге жылжытуды білдіреді

немесе

set the db initializer to DropCreateDatabaseIfModelChanges (немесе better something derived from it and use the Seed() method to write the initial data). To set the initialzer either call Database.SetInitializer() on application start немесе use the appSettings


2
қосылды
DLL-ді қарапайым қайта құрастыру және қайта құру (мүлде ешқандай өзгеріс болмайтындай) орналастыру уақытында осындай проблема туындады және бұл мәселені шешеді
қосылды автор JarrettV, көзі
Бұл үшін рахмет. Менің құпиясым екі қосымшалар сервері бар екеніне байланысты болды, олар мен де айта аламын - бірдей DLL-лер бірдей, алайда олар екеуі де басқаша құрылған «басқаша» деп ойлайды. Мен EdmMetadata кестесін жою арқылы қателерді жоямын және екеуі де бір дерекқормен бақытты түрде жұмыс істейтін сияқты болып көріндім. Бұл дұрыс емес сияқты!
қосылды автор DaveBeta, көзі

Мен кездейсоқ ғана менің .mdf файлымның атын өзгертті және қатені алдым. Міне, сондықтан да қараңыз.

0
қосылды