6

WebAPIを使用してEntityFrameworkからNameIDオブジェクトとして製品名とそのIDを取得しようとしています。コードは次のとおりです。

public class ProductController : ApiController
{
    protected MainDataContext db = new MainDataContext();
    // GET /api/values
    public IQueryable<NameID> Get()
    {
        return db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).AsQueryable();
    }

    // GET /api/values/5
    public NameID Get(long id)
    {
        var result = db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).SingleOrDefault(x => x.ID == id);
        if (id == 0 || result == null)
            throw new HttpResponseException(HttpStatusCode.NotFound); 
        return result;
    }

}
public class NameID {
    public long ID {get;set;}
    public string Name {get;set;}
}

次のようにエラーがスローされます

The magic number in GZip header is not correct.
Make sure you are passing in a GZip stream.

at System.IO.Compression.GZipDecoder.ReadHeader(InputBuffer input) 
at System.IO.Compression.Inflater.Decode() 
at System.IO.Compression.Inflater.Inflate(Byte[] bytes, Int32 offset, Int32 length) 
at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count) 
at System.IO.Compression.GZipStream.Read(Byte[] array, Int32 offset, Int32 count) 
at System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding) 
at System.Xml.XmlTextReaderImpl..ctor(Stream stream, Byte[] bytes, Int32 byteCount, XmlReaderSettings settings, Uri baseUri, String baseUriStr, XmlParserContext context, Boolean closeInput) 
at System.Xml.XmlReaderSettings.CreateReader(Stream input, Uri baseUri, String baseUriString, XmlParserContext inputContext) 
at System.Xml.XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri) 
at System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options) 
at System.Data.Entity.Migrations.Edm.ModelCompressor.Decompress(Byte[] bytes) 
at System.Data.Entity.Migrations.History.HistoryRepository.GetLastModel(String& migrationId) 
at System.Data.Entity.Migrations.History.HistoryRepository.GetLastModel() 
at System.Data.Entity.Internal.InternalContext.QueryForModel() 
at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata) 
at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata) 
at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context) 
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6() 
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) 
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) 
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) 
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) 
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() 
at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector) 
at ProductAPI.Controllers.ProductController.Get() in D:\Demo\ProductAPI\Controllers\ProductController.cs:line 24 
at lambda_method(Closure , Object , Object[] ) 
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.Execute(HttpControllerContext controllerContext, IDictionary`2 arguments) 
at System.Web.Http.Controllers.ApiControllerActionInvoker.<>c__DisplayClass2.<InvokeActionAsync>b__0() 
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
4

4 に答える 4

8

スタックトレースは、データベースからEntityFrameworkモデルのメタデータを読み取る際に問題があることを示しているようです。

HistoryRepository.GetLastModelからXMLを読み取るためModelCompressor.Decompressに使用する呼び出し。これは失敗し、データベース内のモデルメタデータが破損している可能性があります。XDocument.LoadGZipStream

この問題を回避するために、データベースの再作成を試みることができます。

于 2012-04-10T11:46:36.993 に答える
6

それは少し遅く、すでに受け入れられた答えがあり、それはうまくいくでしょう。ただし、すでに動作中のデータベースがあり、データベースを更新したくない場合はDatabase.SetInitializer、Global.asaxのapplication_start関数でnullを指定して呼び出すことができます。これは__migrationhistory、破損したデータを含むテーブルを検索しません。

于 2013-10-23T05:24:13.333 に答える
4

私のためにデータベースを再作成する方法はなく、私はすでにで使用Database.SetInitializerしていnullます。

幸い、別のデータベースに最新__MigrationHistoryのテーブルがあり、このSqlクエリを使用してターゲットデータベースに正しい値を設定しました。

INSERT INTO TargetDbName.dbo.__MigrationHistory (MigrationId, Model, ProductVersion)
SELECT MigrationId, Model, ProductVersion
FROM SourceDbName.dbo.__MigrationHistory
WHERE MigrationId = 'YYYYMMDDHHMMSSFFF_LastMigration' 
于 2013-11-08T15:07:38.187 に答える
0

私の場合、UPDATE-DATABASEを使用してデータベースの移行を実行することで、このエラーを取り除きました。すべての移行ファイルを実行し、移行履歴テーブルとモデルのハッシュ値を作成しました。

以前に何が起こったのかを理解するために、以前はDev環境で移行スクリプトを実行し、本番環境から移行履歴データをコピーしました。Web APIを実行するたびに、EFはデータベースを読み取り、移行履歴テーブルにある仕様と同期されていないデータベースコンテキストを見つけます。

UPDATE-DATABASEを実行した後、すべてがうまくいきました。

于 2020-08-04T16:09:06.347 に答える