Angular 8 How to connect Angular tutorial Tour of The Heroes to Entity Framework+SQL

I need some pointers! My goal is to connect the tutorial to back-end using EF. The tour of the heroes uses in-memory-data.service, instead I want to send the data to the back-end and into the database.
If i am able to add a hero to the database from the front-end that would be a great proof of concept.

Visual Studio Code is used for Front-end running Angular 8 tour of the heroes.
Visual Studio Community 2017 is used for back-end.

I have completed this Tutorial: Get Started with Entity Framework 6 Code First using MVC 5:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

Thanks!

2 Likes

Hello!

Well, You cannot connect directly to Entity Framework, since this is just a part of the stack (the stack being the tools that make a software work).

Angular expects a server that responds with data (JSON, XML, YAML, etc.), which services can consume (the Angular HTTPClient), so You need something between Angular and the Entity Framework that does the job.

On the tutorial, I see they teach You about the MVC Framework, which is what You need. You create controllers which respond to a certain request, but instead of returning a View, You return data (like JSON or XML). Like, for example:

using System.Web.Mvc;

namespace Api {
public class MainController : Controller {
  // Endpoint: /api/welcome
  ActionResult Welcome() {
    return Json(new { "data": "Welcome to My API" });
  }
}
}

In Angular You would create a service like this:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/http';

@Injectable({
  providedIn: 'root'
})
export class WelcomeService {
  // HttpClient is injected by Angular DI.
  constructor(private http: HttpClient) {}

  welcome() {
    // This should log '{ response: "Welcome to My API" }' if everything is setup correctly.
    http.get<any>('/api/welcome').subscribe(response => console.log(response));
  }
}

Another thing to take into account is that The Tour of Heroes data model doesn’t fit the one on the example, so even if You’re able to create the MVC application, it’s not plug n’ play, You’ll need to adjust it.

Something for You to read:

I hope this helps you a little, at least :stuck_out_tongue:.

2 Likes

Thank you!
The links was very helpful. I am studying REST API with ASP.NET:face_with_monocle::cold_sweat:
Bear with me!

The good thing is that the tutorial VS database is working and the Angular hero tutorial.
My idea was that Angular Tour of the hero is almost ready to go, now I only need the backend with database.
I only want to do CRUD with hero name. Is it feasible to convert the two tutorials, or is better to start from scratch?

I have not found any tutorials with complete Angular frontend and VS EF backend with database.

If You only want to CRUD heroes, then it’s quite possible and may be easy to do.

Go for it :slight_smile:!

Ha Ha! Easy!!
I am not sure where to begin.

  • Some bullet-points are appreciated.

I will study Building a REST API with ASP.NET Core some more, maybe I get some ideas!
Thanks!

1 Like

I mean, it’s easy compared to implementing the login and registration, password recovery, security, etc :stuck_out_tongue:.

  • You should begin by creating the data model, then create the entities (or the other way around, letting entity framework create the model, if VS Community has the option).
  • Define the controllers, which will be the ones to perform the CRUD operations on the database.

Now that I think about it, a server application like this should be easier to implement from scratch, plus You’ll learn more. The same can be said for the Tour of Heroes, since it will have a lot of unused code.

Thanks!
Ok, I did find a god tutorial that starts from scratch. Tutorial is Angular7 I use Angular8.

Now I am trying to send data from my form to the WebAPI. It is not working :face_with_head_bandage:
Enable Cors is implemented in WebAPI from NuGet.

Angular console course.component.ts An argument for ‘form’ was not provided.

This is the Firefox console error =>
Message: “No HTTP resource was found that matches the request URI ‘http://localhost:60565/api/ Courses’.”

Below is “some” code.

WebAPI/Models/courses:

namespace WebAPI.Models
{
    using System;
    using System.Collections.Generic;
    
    public partial class Courses
    {
        public int CourseID { get; set; }               //Tried to post this values
        public string CourseName { get; set; }     //Math
        public string Code { get; set; }                  //45
        public string Location { get; set; }            //England
        public Nullable<decimal> Price { get; set; } // 0
    }
}

Angular/courses.model.ts

import { DecimalPipe } from '@angular/common';

export class Courses {
    //Copy from WebAPI Models/Courses.cs convert to typescript
    CourseID   : number;
        CourseName : string;
        Code       : number;
        Location   : string;
        Price      : number;
}

Angular/course.component.ts

import { Component, OnInit } from '@angular/core';
import { CourseService } from 'src/app/shared/course.service';
import { NgForm } from '@angular/forms';

@Component({
  selector: 'app-course',
  templateUrl: './course.component.html',
  styleUrls: ['./course.component.css']
})
export class CourseComponent implements OnInit {

  constructor(private service : CourseService) { }

  ngOnInit() {
    this.resetForm(); // Error
  }

  
  resetForm(form : NgForm){
    if(form !=null)
    form.resetForm();
    this.service.formData = {
      CourseID : null,
      CourseName :'',
      Code : null,
      Location :'',
      Price : null

    }
  }

  onSubmit(form : NgForm){
    this.insertRecord(form);
  }

  insertRecord(form : NgForm){
    this.service.postCourse(form.value).subscribe(res => {
      this.resetForm(form)
    });
  }

}
1 Like

My bad! After I use full adress with /course added it writes to database :smiley:

course.servise.ts

readonly rootURL ="http://localhost:60565/api/course"

YESSS!

2 Likes

Awesome! Congratulations :slight_smile:!

Lets try again!
Now all the CRUD functions are implemented. There are some errors that I don’t understand. What about Angular 7 syntax used in Angular 8? I have this error:

 ERROR in src/app/courses/course/course.component.ts(13,14): error TS2420: Class 'CourseComponent' incorrectly implements interface 'OnInit'.
      Property 'ngOnInit' is missing in type 'CourseComponent' but required in type 'OnInit'.

course.component.ts

import { Component, OnInit } from '@angular/core';
import { CourseService } from 'src/app/shared/course.service';
import { NgForm } from '@angular/forms';
import { ToastrService } from 'ngx-toastr';


@Component({
  selector: 'app-course',
  templateUrl: './course.component.html',
  styleUrls: ['./course.component.css']
})

export class CourseComponent implements OnInit {

  constructor(private service : CourseService,
    private toastr : ToastrService) { }

  ngOnInit() {
    this.resetForm(); 
  }

  
  resetForm(form : NgForm){
    if(form !=null)
    form.resetForm();
    this.service.formData = {
      CourseID: null,
      CourseName:'',
      Code: null,
      Location:'',
      Price: null

    }
  }

  onSubmit(form : NgForm){
    if(form.value.CourseID ==null)
      this.insertRecord(form);
        else
          this.updateRecord(form);

  }

  insertRecord(form : NgForm){
    this.service.postCourse(form.value).subscribe(res => {
      this.toastr.success('Inserted Successfully','Course Register');  
        this.resetForm(form);
          this.service.refreshList();
    });
  }

  /**Subscribe to observable returned from putCourse in Course.service class */
  updateRecord(form: NgForm){
    this.service.putCourse(form.value)
    .subscribe(res => {
      this.toastr.info('Updated Successfully','Course Register');  
        this.resetForm(form);
         this.service.refreshList();
    });
  }

course.service.ts

import { Injectable } from '@angular/core';
import { Courses } from './courses.model';
import { HttpClient} from "@angular/common/http";

@Injectable({
  providedIn: 'root'
})
export class CourseService {

  formData :Courses
  list : Courses[];
  readonly rootURL ="http://localhost:60565/api/course"

  constructor(private http : HttpClient) { }

  //POST formdata to WebAPI
  postCourse(formData : Courses){
   return this.http.post(this.rootURL + '/ Courses',formData)
  }

  /*GET   call WepAPI GET method returns an observable
  store in Courses[]*/
  refreshList(){
    this.http.get(this.rootURL + '/ Courses')
    .toPromise().then(res => this.list = res as Courses[]);
  }

  /**PUT call WebAPI/controller PUT function Update Course, returns an observable*/
  putCourse(formData : Courses){
    return this.http.put(this.rootURL + '/ Courses/'+formData.CourseID,formData);
   }


   /*delete api/Course/5  use id as argument */
   deleteCourse(id :number){
    return this.http.delete(this.rootURL + '/ Courses/'+id);
      }
   }
}

Hmmm, that’s weird. The method is clearly implemented, although it may be because there is a missing } at the end of the CourseComponent, or You didn’t copy the entire code (it happens :stuck_out_tongue:).

Other than that, I don’t see any problem :sweat_smile:. Could You share the code on github or stackblitz (only the client, Angular)? I think the error is in another file (there may be larger error log?).

Hi!
I had to insert a null parameter after form?
Now I am able to POST to WebAPI, but delete or update “PUT” is not working.

export class CourseComponent implements OnInit {

  constructor(private service : CourseService,
    private toastr : ToastrService) { }

  ngOnInit() {
    this.resetForm(); 
  }

  
  resetForm(form? : NgForm){

I have github, will try do that.

This is the course.service file:

import { Injectable } from '@angular/core';
import { Courses } from './courses.model';
import { HttpClient} from "@angular/common/http";

@Injectable({
  providedIn: 'root'
})
export class CourseService {

  formData :Courses
  list : Courses[];
  readonly rootURL ="http://localhost:60565/api/course"

  constructor(private http : HttpClient) { }

  //POST formdata to WebAPI
  postCourse(formData : Courses){
   return this.http.post(this.rootURL + '/ Courses',formData)
  }

  /*GET   call WepAPI GET method returns an observable
  store in Courses[]*/
  refreshList(){
    this.http.get(this.rootURL + '/ Courses')
    .toPromise().then(res => this.list = res as Courses[]);
  }

  /**PUT call WebAPI/controller PUT function Update Course, returns an observable*/
  putCourse(formData : Courses){
    return this.http.put(this.rootURL + '/ Courses/'+formData.CourseID,formData);
   }


   /*delete api/Course/5  use id as argument */
   deleteCourse(id :number){
    return this.http.delete(this.rootURL + '/ Courses/'+id);
   }
}

Does your list refresh or returns the expected values? Log them using the console or check the Network tab on the developer tools of Your browser; there search for a request to /api/course/ Courses. By the way, Your endpoint (on the API) is called / Courses? Includes that space between the forward slash / and the Courses?

OK!
The space is just something I added, no reason for that :stuck_out_tongue_closed_eyes:
Did remove spaces in put and delete function at Angular.

Whem I try delete this error pops up in Firefox console:

Object { headers: {…}, status: 0, statusText: "Unknown Error", url: "http://localhost:60565/api/course/Courses/1", ok: false, name: "HttpErrorResponse", message: "Http failure response for http://localhost:60565/api/course/Courses/1: 0 Unknown Error", error: error }

update error in Firefox console:

ERROR 
Object { headers: {…}, status: 0, statusText: "Unknown Error", url: "http://localhost:60565/api/course/Courses/1", ok: false, name: "HttpErrorResponse", message: "Http failure response for http://localhost:60565/api/course/Courses/1: 0 Unknown Error", error: error }

What does it say on the Network tab of the developer tools? Check the logs of the server (ASP) to see if the requests are even reaching and/or defined, since a status of 0 can mean many things:

  • The request never reached the server (a firewall, for example)
  • A browser plugin may be messing with the request
  • CORS may be too strict or not configured properly.

Use a tool like the Firefox extension RESTer to make sure the server is responding as expected. Once it’s working, start debugging the client app.

Update:

For reference about what a status of 0 means, check this response on StackOverflow:

The actual W3C spec defines the conditions for which zero is returned here: Fetch Standard

As you can see from the spec (fetch or XmlHttpRequest) this code could be the result of an error that happened even before the server is contacted.

Some of the common situations that produce this status code are reflected in the other answers but it could be any or none of these problems:

  1. Illegal cross origin request (see CORS)
  2. Firewall block or filtering
  3. The request itself was cancelled in code
  4. An installed browser extension is mucking things up

What would be helpful would be for browsers to provide detailed error reporting for more of these status==0 scenarios. Indeed, sometimes status==0 will accompany a helpful console message, but in others there is no other information.

Thank you so much!
I have enabled CORS package inside the Web API Project.
I tried to delete, servers status code 404 not found
changed
Request URL:http://localhost:60565/api/course/Courses/1
to in Network tab
Request URL:http://localhost:60565/api/Courses/1
status 200 ok
but id is not deleted in database

I was able to push angular project to github. I don’t use GitHub much, sorry if things take some time!
This is the link to repository:

If the row is not deleted on the database, then there is a problem on the server (.NET) :frowning:.

I know I asked for the Angular source code only, but that was before finding out that there are problems on the API too :sweat_smile:, so I will ask You to share the API code too.

Add a file called .gitignore to the root of the visual studio project folder with this contents (a gitignore file ignores the files and folders specified on it when staging files):

# Created by https://www.gitignore.io/api/csharp,visualstudio
# Edit at https://www.gitignore.io/?templates=csharp,visualstudio

### Csharp ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

### VisualStudio ###

# User-specific files

# User-specific files (MonoDevelop/Xamarin Studio)

# Mono auto generated files

# Build results

# Visual Studio 2015/2017 cache/options directory
# Uncomment if you have tasks that create the project's static files in wwwroot

# Visual Studio 2017 auto generated files

# MSTest test Results

# NUnit

# Build Results of an ATL Project

# Benchmark Results

# .NET Core

# StyleCop

# Files built by Visual Studio

# Chutzpah Test files

# Visual C++ cache files

# Visual Studio profiler

# Visual Studio Trace Files

# TFS 2012 Local Workspace

# Guidance Automation Toolkit

# ReSharper is a .NET coding add-in

# JustCode is a .NET coding add-in

# TeamCity is a build add-in

# DotCover is a Code Coverage Tool

# AxoCover is a Code Coverage Tool

# Visual Studio code coverage results

# NCrunch

# MightyMoose

# Web workbench (sass)

# Installshield output folder

# DocProject is a documentation generator add-in

# Click-Once directory

# Publish Web Output
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted

# NuGet Packages
# NuGet Symbol Packages
# The packages folder can be ignored because of Package Restore
# except build/, which is used as an MSBuild target.
# Uncomment if necessary however generally it will be regenerated when needed
# NuGet v3's project.json files produces more ignorable files

# Microsoft Azure Build Output

# Microsoft Azure Emulator

# Windows Store app package directories and files

# Visual Studio cache files
# files ending in .cache can be ignored
# but keep track of directories ending in .cache

# Others

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)

# RIA/Silverlight projects

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)

# SQL Server files

# Business Intelligence projects

# Microsoft Fakes

# GhostDoc plugin setting file

# Node.js Tools for Visual Studio

# Visual Studio 6 build log

# Visual Studio 6 workspace options file

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)

# Visual Studio LightSwitch build output

# Paket dependency manager

# FAKE - F# Make

# CodeRush personal settings

# Python Tools for Visual Studio (PTVS)

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio

# Telerik's JustMock configuration file

# BizTalk build output

# OpenCover UI analysis results

# Azure Stream Analytics local run output

# MSBuild Binary and Structured Log

# NVidia Nsight GPU debugger configuration file

# MFractors (Xamarin productivity tool) working folder

# Local History for Visual Studio

# BeatPulse healthcheck temp database

# Backup folder for Package Reference Convert tool in Visual Studio 2017

# End of https://www.gitignore.io/api/csharp,visualstudio

Then create a repository on github.com and init a repository for Your visual studio project. Then commit the files to github.

I did push both Angular and WebAPI to GitHub :stuck_out_tongue:

This is the .gitignore file from Visual Studio:

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc