private void WriteDataContext()
		{
			CsDb.CodeGen.Tracing.Trace($"Writing datacontext files", 1);
			var fi = new FileInfo(Path.Combine(CodeBundle.Directory, CodeBundle.Context.Name + CodeBundle.FileExtension));

			var ns = new CsDbCodeNamespace { Namespace = CodeBundle.NameSpace };
			ns.Usings.AddRange(CodeBundle.Databases.Select(x=>x.DataSetNameSpace));

			WriteFile(fi, ns, CodeBundle.Context);
		}
		private void WriteDataSet(CsDbCodeBundleForDb dbBundle)
		{
			CsDb.CodeGen.Tracing.Trace($"Writing dataset", 2);
			var fi = new FileInfo(Path.Combine(dbBundle.DataSetDirectory, dbBundle.DataSet.Name + CodeBundle.FileExtension));

			var ns = new CsDbCodeNamespace { Namespace = dbBundle.DataSetNameSpace };
			if (dbBundle.Views.Length != 0)
				ns.Usings.Add(dbBundle.ViewsNameSpace);
			ns.Usings.Add(dbBundle.RowsNameSpace);
			ns.Usings.Add(dbBundle.TablesNameSpace);
			ns.Usings.Add(CodeBundle.NameSpace);

			WriteFile(fi, ns, dbBundle.DataSet);
		}
		private void WriteFile(FileInfo file, CsDbCodeNamespace codeNameSpace, FileTemplate content)
		{
			GeneratedFiles.Add(file.FullName);
			if (file.Exists && IsFileUnchanged(file, content.GetHash()))
			{
				return;
			}
			file.CreateDirectory_IfNotExists();
			codeNameSpace.Content = content.GetString(1);

			using (var wr = new StreamWriter(file.FullName, false, Encoding.Unicode))
			{
				wr.Write(codeNameSpace.GetString());
			}
		}
		private void WriteRows(CsDbCodeBundleForDb dbBundle)
		{
			CsDb.CodeGen.Tracing.Trace($"Writing {dbBundle.Tables.Length + dbBundle.Views.Length} rows", 2);
			foreach (var model in dbBundle.Tables.Select(x => x.Row))
			{
				var fi = new FileInfo(Path.Combine(dbBundle.RowsDirectory, model.Name + CodeBundle.FileExtension));

				var ns = new CsDbCodeNamespace { Namespace = dbBundle.RowsNameSpace };
				ns.Usings.Add(dbBundle.DataSetNameSpace);
				ns.Usings.Add(dbBundle.TablesNameSpace);
				ns.Usings.Add(dbBundle.RowInterfacesNameSpace);
				ns.Usings.Add(dbBundle.PocoRowsNameSpace);

				WriteFile(fi, ns, model);
			}
			foreach (var model in dbBundle.Views.Select(x => x.Row))
			{
				var fi = new FileInfo(Path.Combine(dbBundle.RowsDirectory, model.Name + CodeBundle.FileExtension));

				var ns = new CsDbCodeNamespace { Namespace = dbBundle.RowsNameSpace };
				ns.Usings.Add(dbBundle.DataSetNameSpace);
				if (dbBundle.Views.Length != 0)
					ns.Usings.Add(dbBundle.ViewsNameSpace);

				WriteFile(fi, ns, model);
			}
		}
		private void WritePocoRows(CsDbCodeBundleForDb dbBundle)
		{
			CsDb.CodeGen.Tracing.Trace($"Writing {dbBundle.Tables.Length} poco rows", 2);
			foreach (var pocoRow in dbBundle.PocoRows)
			{
				var fi = new FileInfo(Path.Combine(dbBundle.PocoRowsDirectory, pocoRow.Name + CodeBundle.FileExtension));

				var ns = new CsDbCodeNamespace { Namespace = dbBundle.PocoRowsNameSpace };


				ns.Usings.Add(dbBundle.RowInterfacesNameSpace);
				ns.Usings.Add($"{pocoRow.Name}={dbBundle.PocoRowsNameSpace}.{pocoRow.Name}");

				WriteFile(fi, ns, pocoRow);
			}
		}
		private void WriteViews(CsDbCodeBundleForDb dbBundle)
		{
			CsDb.CodeGen.Tracing.Trace($"Writing {dbBundle.Views.Length} Tables", 2);
			foreach (var view in dbBundle.Views)
			{
				var fi = new FileInfo(Path.Combine(dbBundle.ViewsDirectory, view.Name + CodeBundle.FileExtension));

				var ns = new CsDbCodeNamespace { Namespace = dbBundle.ViewsNameSpace };

				ns.Usings.Add(dbBundle.DataSetNameSpace);
				ns.Usings.Add($"{view.Row.Name}={dbBundle.RowsNameSpace}.{view.Row.Name}");

				WriteFile(fi, ns, view);
			}
		}