Entity Framework 4.1 Мадэль падтрымаўшы кантэкст змяніўся, так як база дадзеных была створана адразу ж пасля стварэння БД

Я працую над праектам, які выкарыстоўвае Entity Framework 4.1 для захоўваюцца нашы розныя аб'екты базы дадзеных (код першага).

Я тэставанне ў Visual Studio з лакальным SQL Express, DB, і наш сервер Jenkins разгортвае пакончыў код на сервер тэставання. Калі гэта адбудзецца, я часова змяніць сваю лакальную радок падлучэння, каб паказаць на сервер тэставання БД і запусціць модульны тэст паўторна стварыць тэставую базу дадзеных такім чынам, каб ён адпавядаў нашым апошнім арганізацыям і г.д.

Я нядаўна заўважыў наш сервер тэставання дае гэтую памылку:

<Моцны> Мадэль падтрымаўшы кантэкст «» EntityFrameworkUnitOfWork змянілася з тых часоў была створана база дадзеных. Альбо ўручную выдаліць/абнавіць базу дадзеных, або выклічце Database.SetInitializer з асобнікам IDatabaseInitializer. Напрыклад, стратэгія DropCreateDatabaseIfModelChanges будзе аўтаматычна выдаляць і зноўку базу дадзеных, і пры неабходнасці яго насення з новымі дадзенымі.

Гэта, як правіла, прыкмета таго, што наш код змяніўся, і мне трэба, каб запусціць модульны тэст паўторна стварыць базу дадзеных. Акрамя таго я толькі што зрабіў гэта! Я не веру, што няма нічога дрэннага ў нашым працэсе разгортвання - на бібліятэкі DLL на тэставым серверы, здаецца, адны і тыя ж версіі, што і ў маёй мясцовай асяроддзі. Ці існуюць якія-небудзь іншыя параметры або фактары навакольнага асяроддзя, якія могуць выклікаць гэтую памылку аб мадэлі Змяніўшы, паколькі база дадзеных была створана?

Я пачатковец тут - дзякуй за любую дапамогу!

25
Не маглі б вы выкарыстоўваць метад System.Data.Entity.Infrastructure.EdmMetadata.TryGetModelHas & ZWNJ, H (YourDbContext) , каб атрымаць ModelHash і паспрабаваць, што на лакальным кампутары і TestServer, каб убачыць, калі яны адрозніваюцца?
дададзена аўтар Marc, крыніца
Вы запусціць уласны інструмент для таго, каб рэгенераваць кантэкст або спакою пасля рэгенеруюць базы дадзеных?
дададзена аўтар radu florescu, крыніца
@Marc Ды хэшы, здаецца, быць рознымі.
дададзена аўтар DaveBeta, крыніца
@ Floradu88 не 100% упэўнены, што вы маеце на ўвазе. Я выкарыстаў Database.SetInitializer з DropCreateDatabaseAlways DbContext для аднаўлення БД. Я думаю, што было б пакоi?
дададзена аўтар DaveBeta, крыніца

7 адказы

Памылка вы бачыце азначае, што мадэль хэш захоўваецца ў EdmMetadata табліцы адрозніваецца ад мадэлі хэш, вылічанай з мадэлі ў дадатку. Паколькі вы працуеце стварэнне базы дадзеных з іншага прыкладання (ваша дэвіяцыя дадатак), магчыма, што гэтыя два адрозніваюцца. Просты савет тут: не выкарыстоўваць розныя прыкладання для стварэння базы дадзеных і замест таго, каб дазволіць свайму галоўнаму дадаткам стварыць базу дадзеных (альбо аўтаматычна, альбо, напрыклад, з нейкім інтэрфейсам адміністратара).

Як яшчэ адзін варыянт, вы павінны быць у стане адключыць гэтую праверку цалкам выдаліўшы канвенцыю адказнасці за гэтыя праверкі:

modelBuilder.Conventions.Remove();

Мадэль хэш вылічэнні залежыць ад бягучых аб'ектаў у дадатку (любой просты вынік змены ў іншай мадэлі, хэш) і на серверных версіях/маніфесту баз дадзеных. Напрыклад, мадэль разгортвання на SQL Server 2005 i 2008 будуць мець розныя мадэлі хэш (Экспрэс супраць Full альбо 2008 параўнанні з 2008 R2 не павінна прыводзіць да іншай мадэлі, хэш).

25
дададзена
@ppumkin: Адказ быў актуальны да EF4.3
дададзена аўтар Ladislav Mrnka, крыніца
<Код> Папярэджаньне 2 'System.Data.Entity.Infrastructure.IncludeMetadata & ZWNJ; Канвенцыя' не з'яўляецца састарэлым: «The IncludeMetadataConvention больш не выкарыстоўваецца. EdmMetadata не ўключаны ў мадэль. <Глядзі CREF = «EdmModelDiffer» /> у цяперашні час выкарыстоўваецца для выяўлення змяненняў у мадэлі. 2013 Адказ ўжо не актуальная ў EF4
дададзена аўтар ppumkin, крыніца
Кожны атрымаў абнаўленне для EF5.0 або базы даных/мадэлі першых сцэнарыяў? (Па аналогіі з гэтым пытаннем stackoverflow.com/questions/16459047/… )
дададзена аўтар Dave A-W, крыніца
У нас ёсць розныя версіі аперацыйнай сістэмы на працоўным стале і на сэрвэры, і ў нас таксама ёсць некалькі розных версій SQL Server, таму што я выкарыстоўваю SQL Express на месцы, але не на ЕСХН. Калі яго проста факт жыцця, што гэтыя адрозненні платформы будзе выклікаць розныя EdmMetadata хэш, я шчаслівы проста адключыць стварэнне хэш/праверкі шляхам выдалення канвенцыі. Дзякуй!
дададзена аўтар DaveBeta, крыніца

Гэта можа адбыцца з-за упарадкаваннем адлюстравання адрозненняў паміж рознымі платформамі. Каб праверыць, вы можаце выкарыстоўваць API EdmxWriter для параўнання 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: Вы таксама можаце праверыць гэта , калі вы карыстаецеся базу дадзеных спачатку на сервер інтэграцыі

Рэдагаваць 3: Гэта больш падрабязны адказ як адзін з Scott G

3
дададзена
@The хлопец з downvote: Вы па меншай меры, спрабавалі праверыць адказы?
дададзена аўтар radu florescu, крыніца

Ёсць два сервера пад кіраваннем прыкладання пад кіраваннем розных аперацыйных сістэм (ці пакетаў?) Ён з'яўляецца SHA256CryptoService выкарыстоўваецца можа кінуць PlatformNotSupportedException, які прымушае яго Адкат да іншага метаду.

http://msdn.microsoft.com/en -us/бібліятэка/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, калі мадэль выкарыстоўваецца такая ж, як у мадэлі, што БД «ведае».

Калі вы хочаце выканаць міграцыю базы дадзеных, я прапаную вам выкарыстоўваць EF Code First міграцыі , хоць гэта ўсё яшчэ альфа.

Калі вы не хочаце выкарыстоўваць міграцыі вы можаце:

апрацоўваць змена схемы ўручную - гэта азначае, што перасоўванне змесціва табліцы 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, крыніца
Дзякуй за гэта. Мая таямніца была больш вакол таго, што ў мяне ёсць 2 сервера прыкладанняў, якія, наколькі я магу сказаць, ідэнтычныя - вядома, у DLL, якія ідэнтычныя, і ўсё ж яны абодва, здаецца, здаецца, DB, створаны іншы «іншы». Я выявіў, што толькі шляхам выдалення табліцы EdmMetadata я магу здушыць памылку і, здаецца, працуюць з адной базай дадзеных шчасліва абодва прыкладання. Гэта здаецца няправільным!
дададзена аўтар DaveBeta, крыніца

Я толькі выпадкова пераназваў свой файл .mdf і атрымаў гэтую памылку. Так што глядзіце таксама для гэтага.

0
дададзена