6

我正在尝试使用 WebAPI 从 EntityFramework 检索产品名称及其 ID 作为 NameID 对象。代码如下。

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

堆栈跟踪似乎表明从数据库读取实体框架模型元数据时出现问题。

HistoryRepository.GetLastModel用于从. 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 回答