{"record":{"id":"8bd7b086267536fd","repo":"EllanJiang/GameFramework","slug":"you-must-set-resource-manager-first-datatablemanager","errorCode":null,"errorMessage":"You must set resource manager first.","messagePattern":"You must set resource manager first\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/DataTable/DataTableManager.cs","lineNumber":326,"sourceCode":"        /// </summary>\n        /// <param name=\"dataRowType\">数据表行的类型。</param>\n        /// <returns>要创建的数据表。</returns>\n        public DataTableBase CreateDataTable(Type dataRowType)\n        {\n            return CreateDataTable(dataRowType, string.Empty);\n        }\n\n        /// <summary>\n        /// 创建数据表。\n        /// </summary>\n        /// <typeparam name=\"T\">数据表行的类型。</typeparam>\n        /// <param name=\"name\">数据表名称。</param>\n        /// <returns>要创建的数据表。</returns>\n        public IDataTable<T> CreateDataTable<T>(string name) where T : class, IDataRow, new()\n        {\n            if (m_ResourceManager == null)\n            {\n                throw new GameFrameworkException(\"You must set resource manager first.\");\n            }\n\n            if (m_DataProviderHelper == null)\n            {\n                throw new GameFrameworkException(\"You must set data provider helper first.\");\n            }\n\n            TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name);\n            if (HasDataTable<T>(name))\n            {\n                throw new GameFrameworkException(Utility.Text.Format(\"Already exist data table '{0}'.\", typeNamePair));\n            }\n\n            DataTable<T> dataTable = new DataTable<T>(name);\n            dataTable.SetResourceManager(m_ResourceManager);\n            dataTable.SetDataProviderHelper(m_DataProviderHelper);\n            m_DataTables.Add(typeNamePair, dataTable);\n            return dataTable;","sourceCodeStart":308,"sourceCodeEnd":344,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/DataTable/DataTableManager.cs#L308-L344","documentation":"CreateDataTable<T> throws this when the DataTableManager's ResourceManager has not been assigned via SetResourceManager. The manager needs the resource manager to load table assets; without it, table creation cannot proceed, so it fails fast.","triggerScenarios":"Calling CreateDataTable<T>(\"Name\") before calling dataTableManager.SetResourceManager(...), or on a DataTableManager instance that was constructed manually without the initialization the GameFramework component normally performs.","commonSituations":"Bypassing the framework's Unity component (DataTableComponent) and new-ing up DataTableManager directly; calling table creation in an Awake/Start that runs before the framework's initialization step; forgetting SetResourceManager after switching to a custom bootstrap.","solutions":["Call dataTableManager.SetResourceManager(resourceManager) before any CreateDataTable<T> call.","Prefer creating the manager through the framework component (DataTableComponent) so dependencies are wired automatically.","If bootstrapping manually, ensure SetResourceManager and SetDataProviderHelper are both called during startup before any table access.","Move CreateDataTable calls after the framework initialization lifecycle point (e.g. after the component's Start)."],"exampleFix":"// before\nvar dataManager = new DataTableManager();\ndataManager.CreateDataTable<MyRow>(\"MyTable\");\n// after\nvar dataManager = new DataTableManager();\ndataManager.SetResourceManager(resourceManager);\ndataManager.SetDataProviderHelper(dataProviderHelper);\ndataManager.CreateDataTable<MyRow>(\"MyTable\");","handlingStrategy":"validation","validationCode":"if (dataTableManager.ResourceManager == null)\n    throw new InvalidOperationException(\"Call SetResourceManager before CreateDataTable.\");","typeGuard":"bool IsDataTableManagerReady(DataTableManager m) => m != null && m.ResourceManager != null && m.DataProviderHelper != null;","tryCatchPattern":"try { var table = dataTableManager.CreateDataTable<MyRow>(\"MyTable\"); }\ncatch (GameFrameworkException ex) { Log.Error(\"DataTableManager not initialized: {0}\", ex.Message); }","preventionTips":["Call SetResourceManager and SetDataProviderHelper immediately after constructing the manager.","Create tables only after the framework component's initialization lifecycle (not in Awake before dependencies are set).","Use DataTableComponent rather than manually new-ing DataTableManager."],"tags":["csharp","gameframework","datatable","initialization-order"],"backgroundTag":"missing-dependency","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}