【问题标题】:The model backing the <Database> context has changed since the database was created自创建数据库以来,支持 <Database> 上下文的模型已更改
【发布时间】:2011-04-05 17:41:40
【问题描述】:

错误信息:

“支持 'AddressBook' 上下文的模型自创建数据库以来已更改。手动删除/更新数据库,或使用 IDatabaseInitializer 实例调用 Database.SetInitializer。例如,RecreateDatabaseIfModelChanges 策略将自动删除并重新创建数据库,并可选择用新数据为其播种。”

我正在尝试使用代码优先功能,以下是我写的:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

上下文类:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

和连接字符串:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

所以,数据库名称是“AddressBook”,当我尝试将联系人对象添加到上下文时会发生错误。我在这里有什么遗漏吗?

【问题讨论】:

标签: .net entity-framework-4 code-first


【解决方案1】:

现在是:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

在 YourDbContext.cs 文件中。

【讨论】:

  • 我已经手动更改了我的生产数据库并关闭了迁移,它可以工作,谢谢
  • Ps,这在 Global.asax Application_Start() 中
  • 比 Global.asax 更好的是把它放在你的 DbContext 类的构造函数中。这样,它适用于使用上下文的每个站点,而不仅仅是由 Global.asax 文件控制的一个站点。
  • 最好将它放在上下文类的静态构造器中,这样它只被调用一次 - 就像这个示例视频中一样:msdn.microsoft.com/en-us/data/jj572367
  • 它应该放在受保护的覆盖 void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(null); base.OnModelCreating(modelBuilder); }
【解决方案2】:

以下是Jeff 发布的Scott Gu's Blog 的一些关于实际情况的信息:

对于看到此异常的人:

“支持‘生产’上下文的模型自 数据库已创建。手动删除/更新数据库,或 使用 IDatabaseInitializer 实例调用 Database.SetInitializer。”

这是发生了什么以及如何处理它:

当第一次创建模型时,我们运行一个 DatabaseInitializer 来做 如果数据库不存在则创建数据库或添加种子数据。 默认的 DatabaseInitializer 尝试比较数据库架构 需要将模型与存储在 使用数据库创建的 EdmMetadata 表(当 Code First 是 创建数据库的那个)。现有的数据库不会有 EdmMetadata 表,因此不会有哈希......和实现 如果该表丢失,今天将抛出。我们将努力改变这一点 在我们发布最终版本之前的行为,因为它是默认值。 在那之前,现有的数据库通常不需要任何数据库 初始化器,因此可以通过调用为您的上下文类型关闭它:

Database.SetInitializer<YourDbContext>(null);

杰夫

【讨论】:

  • 我今天试过了,我不再得到“模型已更改”,而是得到“无效的对象名称'dbo.Table'”
  • Jeff 希望这是一种解决方法,但它已经过去两年多了,仍然需要将 SetInitializer 设置为 null。正确的?那么有人可以解释一下这如何适应迁移工作流程。
  • @jakejgordon:我也使用 EF6,但如果它在 Global.asax 中,它只会在运行网站时解决问题。如果你有单元测试,你就是 OOL。最好把它放在 YourDbContext 的构造函数中。这会为每个项目修复它,包括网站和测试项目。
  • IMO,这个答案应该得分更高,因为它实际上解释了为什么我们需要添加这行代码。谢谢。
  • @StefanBergfeldt 如果您或任何人收到Invalid object name 'dbo.Table,请检查您的连接字符串 attachDbFilename 和初始目录
【解决方案3】:

对于Entity Framework 5.0.0.0 - 6.1.3

确实想要执行以下操作:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

是的,Matt Frear 是正确的。 更新 - 编辑:需要注意的是,我同意其他人的观点,而不是将此代码添加到 global.asax 添加到您的 DbContext 类中

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

正如其他人所说,这对于处理单元测试也很有好处。

目前我将它与 Entity Framework 6.1.3 /.net 4.6.1 一起使用

我会在不久的将来回来提供一个 CORE sn-p。

【讨论】:

  • 谢谢! Program.cs 绝对适用于控制台。
  • 但是当您第一次初始化数据库时,如果我将 setinitializer null 放在 onModelCreating 方法中,它不会创建数据库。有什么想法吗 ? Eventhoug 我使用 (var context = Activator.CreateInstance()) { context.Database.Initialize(true); }
  • 我需要找到我会使用的代码,我有时会注释掉一行并交换......我不记得这个问题,我需要看看。
  • 最佳解决方案。它导致我的解决方案运行,我不知道后果是什么。提交并部署。
【解决方案4】:

只需在 SQL Server Management Studio 中运行以下 sql 命令:

delete FROM [dbo].[__MigrationHistory]

【讨论】:

  • 你救了我的命!谢谢。
  • 除非您完全了解 __MigrationsHistory 的用途并愿意手动协调代码和数据库之间的差异,并在生产中进行相同的更改,否则请勿删除 __MigrationsHistory 表。
【解决方案5】:

此修复在 CTP5 之后不再有效。

你必须做Database.SetInitializer&lt;YourContext&gt;(null);

【讨论】:

  • 那去哪儿了... OnModelCreating 没有任何可访问的称为 DbDatabase
  • 在启动的某个地方,我在 Application_Start 中设置了我的。
  • Database.SetInitializer 似乎在 EF 4.3 最终版本中运行良好。
  • 我认为“此修复程序在 CTP5 之后不再有效”意味着从 2010 年 8 月 30 日开始接受的答案就是他所说的。
【解决方案6】:

刚刚找到答案并想到这里更新。只需执行以下操作。

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

【讨论】:

  • 这在 EF 的更高版本中不再可能,modelBuilder.Conventions.Remove&lt;IncludeMetadataConvention&gt;(); 也无济于事。 DbDatabase.SetInitialzer(null);确实有效。
  • @TomStickel - 我同意。将stackoverflow.com/a/6143116/255562标记为答案。
【解决方案7】:

或者您可以将此行放在 Application_Start() 下的 Global.asax.cs 文件中:

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

确保将 ProjectName.Path.Context 更改为您的命名空间和上下文。如果首先使用代码,只要对架构进行任何更改,这将删除并创建一个新数据库。

【讨论】:

  • 正是我需要的,因为我只是在做原型设计。非常感谢。
【解决方案8】:

我花了很多天来解决这个问题,分析了很多不同的帖子,尝试了很多选项,终于解决了。 我的解决方案中的这 2 个项目使用 EF 代码优先迁移:

  • 控制台应用程序“DataModel”主要用作程序集,其中包含我的所有代码优先实体、DbContext、迁移和通用存储库。我已经在这个项目中包含了单独的空本地数据库文件(在 DataModel/App_Data 文件夹中),以便能够从包管理器控制台生成迁移。
  • WebApi,它引用DataModel项目并使用WebApi/App_Data文件夹中的本地数据库文件,该文件未包含在项目中

请求 WebApi 时出现此错误...

我的环境:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional 更新 1
  • 我的所有项目都针对 .NET Framework 4.6.1
  • 来自 NuGet 的 EntityFramework 6.1.3

在这里,我收集了您应该注意的所有备注以及必须满足的所有条件/要求,以避免提到的异常:

  1. 对于解决方案中的所有项目,您应该只使用一个版本的 EntityFramework Nuget 包。
  2. 通过顺序运行所有迁移脚本创建的数据库应具有与您的目标数据库相同的结构/架构并对应于实体模型。以下三件事必须完全对应/反映/匹配:
    • 您的所有迁移脚本直到最后
    • 当前代码优先实体模型状态(DbContext、实体)
    • 目标数据库
  3. 目标数据库(mdf 文件)应更新/对应于最后一个迁移脚本。验证目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的记录,这意味着所有迁移脚本都已成功应用于该数据库。我建议您使用 Visual Studio 生成与您的数据库相对应的正确代码优先实体和上下文,项目 -> 添加新项目 -> ADO.NET 实体数据模型 -> 数据库中的代码优先: 当然,作为替代方案,如果您没有数据库,您可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
  4. 连接字符串的名称,例如MyConnectionString 在启动项目(Web.config/App.config)的配置文件中:

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    应该等于你的 DbContext 的构造函数中传递的参数:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. 在使用 Package Manager Console 之前,请确保您使用正确的数据库进行更新或生成迁移,并且需要的项目设置为 解决方案的启动项目。 用于连接到数据库它将使用该 .config 文件中的连接字符串,该文件在项目中设置为启动项目。
  6. 修复了我的问题的主要问题:这很奇怪,但在我的 WebApi/bin 文件夹中,DataModel.exe 是旧的,自上次构建以来没有刷新。由于迁移嵌入在我的程序集 DataModel.exe 中,因此我的 WebApi 使用旧的迁移更新了数据库。我很困惑为什么在 WebApi 中更新数据库后它不对应于 DataModel 的最新迁移脚本。以下代码会自动创建(如果不存在)或更新到我的 WebApi/App_Data 文件夹中的最新迁移本地数据库。

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    我尝试了清理和重建解决方案,但没有帮助,我完全删除了 WebApi 中的 bin 和 obj 文件夹,从 WebApi/App_Data 中删除数据库文件,构建,重新启动 WebApi,向它发出请求,它创建了正确的数据库 - 延迟初始化(使用上面的行),这对应于最新的迁移和异常没有出现更多. 所以,这可能会解决您的问题:

    1. 从您的启动项目中手动删除 bin、obj 文件夹(生成/更新您的数据库)
    2. 构建您的启动项目或更好地清理和重建您的所有解决方案。
    3. 通过启动项目(将执行上面的行)或使用包管理器控制台“update-database”命令重新创建数据库。
    4. 手动检查生成的db和__MirgationHistory是否对应最新的迁移脚本。

【讨论】:

    【解决方案9】:

    对我来说,升级到 4.3.1 后,我只是截断 EdmMetaData 表或直接删除它。

    【讨论】:

    • 我更新到 4.3.1,然后重命名了 EdmMaetaData 表。我现在可以根据需要对模型进行更改,并且不再有关于模型支持等等烦人的错误消息。
    【解决方案10】:

    对于 VB.NET 开发人员:

    将以下行添加到 Glabal.asax.vb 文件的 Application_Start() 方法的末尾

    Database.SetInitializer(Of ApplicationDbContext)(Nothing)
    

    将 ApplicationDbContext 更改为您的特定 Db 上下文。

    【讨论】:

      【解决方案11】:

      我遇到了这个问题,结果发现一个项目指向 SQLExpress,但有问题的项目指向 LocalDb。 (在他们各自的 web.config 中)。愚蠢的疏忽,但值得注意的是,以防其他人解决此问题。

      【讨论】:

        【解决方案12】:

        这意味着上下文中有一些尚未执行的更改。 请先运行 Add-Migration 以生成我们所做的更改(我们可能不知道的更改) 然后运行更新数据库

        【讨论】:

          【解决方案13】:

          我遇到了同样的问题 - 重新添加迁移和更新数据库不起作用,而且上面的答案似乎都不正确。然后灵感袭来——我正在使用多个层次(一个网络、一个数据和一个业务)。数据层具有上下文和所有模型。 Web 层从未抛出此异常 - 它是业务层(我将其设置为用于测试和调试的控制台应用程序)。原来业务层没有使用正确的连接字符串来获取数据库并创建上下文。所以我将连接字符串添加到业务层(和数据层)的应用程序配置中,并且它可以工作。在这里为可能遇到相同问题的其他人提供。

          【讨论】:

            【解决方案14】:

            我使用 Database.CompatibleWithModel 方法(在 EF5 中可用)在使用之前测试模型和 DB 是否匹配。我在创建上下文后调用此方法...

                    // test the context to see if the model is out of sync with the db...
                    if (!MyContext.Database.CompatibleWithModel(true))
                    {
                        // delete the old version of the database...
                        if (File.Exists(databaseFileName))
                            File.Delete(databaseFileName);
                        MyContext.Database.Initialize(true);
            
                        // re-populate database
            
                    }
            

            【讨论】:

              【解决方案15】:

              此错误可能表明您的连接字符串存在问题,以及您的连接字符串名称是否与数据库上下文声明匹配。

              我遇到了这个错误,因为我错误地命名了本地数据库(愚蠢的错误),并且 web.config 中“DefaultConnection”的连接字符串的名称与 MyDbContext 不匹配,即

              public MyDbContext(): base("DefaultConnection")
              {}
              
              
              <connectionStrings>
                  <add name="DefaultConnection" ...
                </connectionStrings>
              

              【讨论】:

              • 这应该是公认的答案!!其他人的回答在这里浪费了我一个小时的时间,这是唯一一个在几乎不需要更改任何内容的情况下杀死错误消息的人。
              【解决方案16】:

              好建议,但是,在所有情况下都不是那么准确。我想出一个。 请确保您在 Visual Studio 中使用 PM 窗口运行“启用迁移”,迁移文件夹将添加到您的项目中。

              确保添加到文件夹中的两个 c# 类文件将包含您的所有模型及其各自的属性。

              如果您拥有构建解决方案的所有内容,并发布用于部署。

              逻辑是不能覆盖现有的元数据,因为您的应用程序没有元数据来替换当前的。结果,您收到此错误“支持上下文的模型自创建数据库以来已更改”

              【讨论】:

                【解决方案17】:

                以防万一有人和我有同样的情况。

                我有数据库第一个 EF,同时使用 asp.net 身份

                所以我的 webconfig 中有两个连接字符串,这没有问题。碰巧我创建/运行脚本来手动生成我不应该的 asp.net 身份表。

                所以首先删除您手动/从脚本创建的所有 asp.net 身份表。

                DROP TABLE __MigrationHistory
                DROP TABLE AspNetRoles
                DROP TABLE AspNetUserClaims
                DROP TABLE AspNetUserLogins
                DROP TABLE AspNetUserRoles
                DROP TABLE AspNetUsers
                

                【讨论】:

                  【解决方案18】:

                  这些解决方案都不适合我们(除了完全禁用架构检查)。最后,我们的 Newtonsoft.json 版本出现了不匹配

                  我们的 AppConfig 没有正确更新:

                  <dependentAssembly>
                     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                      <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
                    </dependentAssembly>
                  

                  解决方案是将程序集版本更正为我们实际部署的版本

                  <dependentAssembly>
                     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                      <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
                    </dependentAssembly>
                  

                  【讨论】:

                  • 我们在 Newtonsoft.json 的版本中遇到了类似的问题,当我们更新版本时问题得到了解决。
                  【解决方案19】:

                  在对该主题进行了一些研究后,我发现如果您之前在本地 sql server express 上创建了一个 db 实例,则基本上会发生错误。因此,每当您对 db 进行更新并尝试更新 db/在 db 上运行一些代码而不使用 Package Manager Console 运行 Update Database 命令时;首先,您必须手动删除我们本地 sql express 上以前的数据库。

                  此外,除非您的配置中有AutomaticMigrationsEnabled = false;,否则此解决方案有效。

                  如果您使用版本控制系统(git、svn 等)并且其他一些开发人员在生产阶段更新 db 对象,那么每当您更新代码库并运行应用程序时,就会出现此错误。

                  如上所述,在代码库中有一些解决方案。但是,这在某些情况下是最实用的。

                  【讨论】:

                    【解决方案20】:

                    我也在阅读 Pro ASP.NET MVC 4 书,遇到了同样的问题。对我来说,在进行本书“添加模型验证”部分中规定的更改后,我开始遇到问题。我解决问题的方法是将我的数据库从 localdb 移动到成熟的 SQL Server 2012 服务器。 (顺便说一句,我知道我很幸运可以切换到完整版本,所以不要恨我。;-)))一定是与数据库的通信导致问题。

                    【讨论】:

                    • 你怎么知道它是与数据库的通信,而不是它的元数据?
                    • 抱歉回复晚了。事实证明这根本不是沟通问题!重新创建数据库只是掩盖了问题,因为我又遇到了同样的问题!一个 __Migrationxxx(不记得表的确切名称,因为我刚刚删除了它)是由 ef 创建的。只需删除它,你应该一切都好。
                    • @MyJ3 所有人都在吐槽所有这些该死的代码行。这就是我所需要的!值得回答(可选场景)。
                    • @Terrance00 谢谢!
                    【解决方案21】:

                    检查以下步骤

                    1. Database.SetInitializer(null); -->在 Global.asax.cs 中

                    2。

                    1. 您的 Context 类名应与 检查一下

                    【讨论】:

                      【解决方案22】:

                      修改Global.asax.cs,包括Application_Start事件:

                      Database.SetInitializer<YourDatabaseContext>(
                       new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
                      

                      【讨论】:

                      • 就个人而言,我会更清楚一点。
                      • NO NO NO,我 99% 的时间都不想使用 DropCreateDatabaseIfModelChanges!
                      【解决方案23】:

                      尝试使用属于 using System.Data.Entity 的 Database SetInitializer;

                      在 Global.asax 中

                      protected void Application_Start()
                      {
                          Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
                      }
                      

                      这将在每次更改模型时创建新数据库。但是您的数据库将是空的。为了用虚拟数据填充它,您可以使用 Seeding。您可以将其实现为:

                      播种 ::

                      protected void Application_Start()
                      {
                          Database.SetInitializer(new AddressBookInitializer());
                                      ----rest code---
                      }
                      public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
                      {
                          protected override void Seed(AddressBook context)
                          {
                              context.yourmodel.Add(
                              {
                      
                              });
                              base.Seed(context);
                          }
                      
                      }
                      

                      【讨论】:

                        【解决方案24】:

                        这很奇怪,但这里的所有答案对我来说都是无用的。 对我来说工作初始化器

                        MigrateDatabaseToLatestVersion

                        这是我的解决方案(我知道,它可以更简单,但我就是这样使用它的):

                        class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
                        {
                        }
                        
                        public class MyDbContext: DbContext
                        {
                            public MyDbContext() : base("DbName")
                            {
                                SetInitializer();
                            }
                        
                            public MyDbContext(string connString) : base(connString)
                            {
                                SetInitializer();
                            }
                        
                            private static void SetInitializer()
                            {
                                if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
                                    Database.SetInitializer(new MyDbInitializerForTesting());
                                else
                                    Database.SetInitializer(new MyDbMigrateToLatest());
                            }
                        }
                        
                        public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
                        {
                            public Configuration()
                            {
                                AutomaticMigrationsEnabled = true;
                            }
                        
                            protected override void Seed(MyDbContext context)
                            {
                                // Whatever
                            }
                        }
                        

                        MyDbInitializerForTesting 只是从 DropCreateDatabaseAlways 继承,所以在某些特定情况下(测试),整个数据库都会被重建。否则,它会迁移到最新版本。

                        我的来源:https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

                        【讨论】:

                          【解决方案25】:

                          当我们将一个数据库用于两个应用程序时,我遇到了同样的问题。在上下文类型部分设置disableDatabaseInitialization="true" 对我有用。

                          <entityFramework>
                          <providers>
                            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
                          </providers>
                          <contexts>
                            <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
                              <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
                            </context>
                          </contexts>
                          

                          查看更多详情https://msdn.microsoft.com/en-us/data/jj556606.aspx

                          【讨论】:

                            【解决方案26】:

                            创建自定义上下文初始化器:

                            public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
                            {
                                public override void InitializeDatabase(MyDbContext context)
                                {
                                    bool exists = context.Database.Exists();
                            
                                    base.InitializeDatabase(context);
                            
                                    if (!exists)
                                    {         
                                        MyDbSeed.Seed(context);
                                    }
                                }       
                            }
                            

                            请注意,Migrations.Configuration 是由 Package Manager Console 中的迁移命令行生成的类。您可能需要将 Migrations.Configuration 类的 internal 更改为 public 修饰符。

                            并从您的 OmModelCreating 注册它:

                            public partial class MyDbContext : DbContext
                            {
                            
                                protected override void OnModelCreating(DbModelBuilder modelBuilder)
                                {
                                    Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());
                            
                                    //other code for creating model
                                }
                            }
                            

                            【讨论】:

                              【解决方案27】:

                              这里我想分享另一种防止上下文改变时模型支持错误的方法是:

                              1) 打开您的 DbContext 文件

                              2) 使用 Microsoft.AspNet.Identity.EntityFramework 添加命名空间;

                              3) 公共 MyDbContext() : base("name=MyDbContext") { Database.SetInitializer(new DropCreateDatabaseAlways()); }

                              【讨论】:

                              • 这将删除您的整个数据库。也许这对开发来说没问题,但是当代码意外发布到生产环境并删除所有内容时,没有人会对此感到高兴。
                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-04-19
                              • 2015-04-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-01-21
                              • 1970-01-01
                              相关资源
                              最近更新 更多