No connection string named ‘…’ could be found in the application config file.

Two-tier applications separate the presentation layer and the data layer, and all database access related objects are located in the data-tier.

When the application runs, the config file of the main project is read. In web applications, it is the web.config, in console applications the app.config file.

When you get the following runtime exception

Exception thrown: ‘System.InvalidOperationException’ in EntityFramework.dll
An exception of type ‘System.InvalidOperationException’ occurred in EntityFramework.dll but was not handled in user code
No connection string named ‘…Entities’ could be found in the application config file.

 

  1. Copy the connection string from the app.config file of the data-tier to the main project’s config file.
 <add name="USC_SocialMediaMSSQLEntities" connectionString="metadata=res://*/USC_SocialMedia_MSSQL.csdl|res://*/USC_SocialMedia_MSSQL.ssdl|res://*/USC_SocialMedia_MSSQL.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MY_SERVER;initial catalog=MY_DATABASE;user id=MY_USER;password=MY_PASWORD;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

2. This is a sample data access class in the data-layer to read data from the aspNetRoles table.

using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SocialMedia_Data {
	public class SocialMediaData {

		private USC_SocialMediaMSSQLEntities _web;

		public SocialMediaData() {

			// Set up the database connections
			_web = new USC_SocialMediaMSSQLEntities();

		}

		/// Returns the list of Roles
		public List GetRoles() {

			IEnumerable foundRoles = from aspNetRoles in _web.AspNetRoles
						 orderby aspNetRoles.DisplayOrder
						 select aspNetRoles;

			if (null == foundRoles || 0 == foundRoles.Count()) {
				return null;
			}

			return foundRoles.ToList();

		}
	}
}

delimited by end-of-file (wanted `EOF’)

When you create a file in a script and use an end of file delimiter,

if ...
  cat <<EOF> $chef_dir/attrib.json
    $json
  EOF
fi

and you indent the word EOF to look nicer, you will get the error message

warning: here-document at line … delimited by end-of-file (wanted `EOF’)
STDERR> …: line …: syntax error: unexpected end of file

To correct the script, move the EOF to the beginning of the line

if ...
  cat <<EOF> $chef_dir/attrib.json
    $json
EOF
fi

could not find filename for attribute .DS_Store in cookbook

The Macintosh workstation saves application states in .DS_Store files. When you edit your Chef cookbooks the MacOS leaves these files in many folders.

When the Chef cookbook is executed, the Chef Client reads all files in the attributes folder and tries to extract values from them. If the .DS_Store file is uploaded with the rest of the cookbook to the Chef server, the Chef cookbook execution stops with the error message:

=============================================================
Recipe Compile Error in /var/chef/cache/cookbooks/…/attributes/.DS_Store
=============================================================

Chef::Exceptions::AttributeNotFound
———————————–
could not find filename for attribute .DS_Store in cookbook …

When you test your cookbook with Test Kitchen, there is no error, so you cannot detect the existence of the file until the Chef cookbook starts to run on the instance.

Even though the.DS_Store file cannot be seen in Finder, it still can be there. It is a hidden file, and even if you enable the display of hidden files, Finder does not show it.

$ cd attributes
$ ls -a
. .. .DS_Store default.rb

To remove the .DS_Store file from the cookbook

  1. Make sure the .DS_Store file is added to the chefignore file
  2. Delete the file from the folder on your workstation
    rm .DS_Store
  3. Increment the version of the cookbook in the metadata.rb file
  4. Upload the new version of the cookbook to the Chef server
    knife cookbook upload MY_COOKBOOK --freeze

 

NotSupportedException: Unable to determine the provider name for provider factory of type ‘MySql.Data.MySqlClient.MySqlClientFactory’. Make sure that the ADO.NET provider is installed or registered in the application config

In a two-tier web application, the data layer is in a separate project. This allows better separation between the presentation layer and the data layer. This way you can reuse the data project in another application that targets the same database.

To access a MySql database you need to add the MySql.Data and MySql.Data.Entity NuGet packages to the data project.

When you develop a two-tier application that targets a MySql database you may get the runtime error

NotSupportedException: Unable to determine the provider name for provider factory of type ‘MySql.Data.MySqlClient.MySqlClientFactory’. Make sure that the ADO.NET provider is installed or registered in the application config.

Even if all database interaction is handled in the data project, and you added the MySql NuGet packages to it, you need to add the MySql.Data and MySql.Data.Entity NuGet packages to the web project too, because the Web.config file contains the connection string that includes the reference to MySql.Data.MySqlClient.

<add name="MY_CONNECTION_NAME" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=MY_DATABASE;uid=MY_USERNAME;password=MY_PASSWORD" />

At the time of writing do not use version 6.10.6.0 of the packages, it causes the error

Exception thrown: ‘System.TypeLoadException’ in mscorlib.dll
An exception of type ‘System.TypeLoadException’ occurred in mscorlib.dll but was not handled in user code
Inheritance security rules violated by type: ‘MySql.Data.MySqlClient.MySqlProviderServices’. Derived types must either match the security accessibility of the base type or be less accessible.

Until a new, corrected version is published, install version 6.9.11.0 of both packages in both projects.

For more information on how to connect to a MySql database from Visual Studio see Connect to a MySQL database from Visual Studio 2017

 

 

Configure the ASP.NET MVC 5 web application to use an external database for user authentication

When a new ASP.NET web application is created with the authentication set to Individual User Accounts, it automatically creates an SQL Express internal database in the App_Data directory of the application when you register the first user. To create the ASP.NET web application with user authentication see Create an ASP.NET Web Application with user authentication

This is sufficient for a small, proof of concept web application, but enterprise-grade applications should use a secure, backed up database.

To connect an ASP.NET MVC web application to an external database

  1. Create a new database in the database server
    CREATE DATABASE MY_DATABASE_NAME
    GO
  2. Create a user and add it to the database as db_owner
    DECLARE @user_name varchar(50)
    SET @user_name = 'MY_USER_NAME'
    
    -- Create the user account
    CREATE LOGIN MY_USER_NAME
     WITH PASSWORD='MY_PASSWORD'
    
    -- Add the user to the database 
    USE MY_DATABASE_NAME; EXEC sp_grantdbaccess @user_name; EXEC sp_addrolemember @rolename = 'db_owner', @membername = @user_name;
    GO
  3. Replace the connection string in the Web.config file
    <connectionStrings>
        <add name="DefaultConnection"
            connectionString="Data Source=MY_SQL_SERVER_NAME;Initial Catalog=MY_DATABASE_NAME;user id=MY_USER_NAME;password=MY_PASSWORD"
            providerName="System.Data.SqlClient" />
    </connectionStrings>

There are two way to generate the user authentication tables

Use the new web application to automatically generate the tables

  1. Run the ASP.NET MVC 5 web application
  2. Select Register in the menu of the web application and register a user
  3. The application will automatically generate the user authentication tables in the database

Generate an SQL script to create the database

Delete the existing database

Only delete the existing database if you have no important data or configuration changes in the existing database!

The script generator checks the database for existing tables, so if you have used the web application to automatically create the tables, delete the database, so the generated script will contain all necessary steps to create the entire database.

  1. Close the tab in Microsoft SQL Server Management Studio that you used to connect to the new database to close the open connection to it
  2. Open a new tab in Microsoft SQL Server Management Studio and execute
    DROP DATABASE MY_DATABASE_NAME

Configure the web application for Code First development.

  1. In the Tools menu of Visual Studio select NuGet Package Manager, Package Manager Console
  2. At the bottom of the screen, the Package Manager Console window opens
  3. In the Package Manager Console execute
    Enable-Migrations –EnableAutomaticMigrations

    PM> Enable-Migrations –EnableAutomaticMigrations
    Checking if the context targets an existing database…
    Code First Migrations enabled for project USC_SocialMediaWebApp.</blockquote

  4. The command generates the Configuration.cs file in the Migrations folder of your solution.

Generate the code to update the database

  1. In the Package Manager Console execute
    Add-Migration Init

    PM> Add-Migration Init
    Scaffolding migration ‘Init’.
    The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running ‘Add-Migration Init’ again.

  2. The command generates the necessary code to create the database tables

If you make changes to your models or the seeding script, execute the “Add-Migration Init” command again in the  Package Manager Console.

Create the database

The steps above generated the necessary code to create the database. To create the database

    1. For the script to be able to create the database, temporarily replace the “db_owner” user with a username and password of a “dbo” user in the database server. Otherwise, we may get

      System.Data.SqlClient.SqlException (0x80131904): CREATE DATABASE permission denied in database ‘master’

      Error Number:262,State:1,Class:14
      CREATE DATABASE permission denied in database ‘master’.

    2. In the Package Manager Console execute
      Update-Database -Verbose

      The -Verbose option displays the executed SQL commands during the database creation. You can save them to create the production database by executing it.

      PM> Update-Database
      Specify the ‘-Verbose’ flag to view the SQL statements being applied to the target database.
      Applying explicit migrations: [201802120745059_Init].
      Applying explicit migration: 201802120745059_Init.
      Running Seed method.

    3. Change the username and password back to the “db_owner” user credentials in the Web.config file of the web application.
    4. Execute this SQL statement in Microsoft SQL Management Studio to add the “db_owner” user to the database
      DECLARE @user_name varchar(50)
      SET @user_name = 'MY_USER_NAME'
      
      -- Add the user to the database 
      USE MY_DATABASE_NAME; EXEC sp_grantdbaccess @user_name; EXEC sp_addrolemember @rolename = 'db_owner', @membername = @user_name;
      GO

Create an ASP.NET MVC 5 Web Application with user authentication

To create a new ASP .NET MVC web application that contains user authentication code

  1. In the File menu of Visual Studio select New, Project
  2. On the left select Visual C#, Web, and in the middle select ASP.NET Web Application (.NET Framework)
  3. Enter the Name, select the solution folder location and click OK. The solution name will automatically match the value of the Name field.
  4. Select MVC and click the Change Authentication button
  5. To use your database for authentication select Individual User Accounts
  6. Make sure the correct authentication is selected and click OK

This ASP.NET MVC 5 web application automatically creates an SQL Express internal database in the App_Data directory of the application when you register the first user.

  1. Start the application
  2. Click Register in the menu of the web application
  3. Register a user

To use an external database for user authentication, see the next post at Configure the ASP.NET MVC 5 web application to use an external database for user authentication

Flashing Side Marker Lamps

In the US it is not required to make the turn signals visible from the side of the vehicle. Many cars sold in the US have their front turn signals positioned between the headlights, so those are usually not visible from the side. If another car is next to yours, the other driver cannot see your rear turn signals, and because there are no front turn signals on the corner of your vehicle, they cannot see the font signals either. You can mount additional turn signals on the side of your car, but most of the time you need to drill holes into the body of the car, that can open the door for early corrosion of your vehicle.

If your car uses conventional light bulbs for the turn signals and the side markers, it is easy to make the side markers flash too.

The idea came from Daniel Stern at http://www.danielsternlighting.com/tech/markerflash/markerflash.html Read the “Crossfeed method” section for the explanation how it works.

Flashing side marker with lights off

Flashing side marker with lights on

The Honda CR-V has plenty of room under the hood to make this modification easy.

  1. Find the side marker and turn signal lights
  2. Disconnect the turn signal connector from the back of the turn signal bulb
  3. Remove the black electrical tape at the junction where the turn signal wires go down to the bulb
  4. Cut the black ground wire with one (1) silver dot leading to the side marker closer to the battery end
  5. Connect the side marker end of the black grounding wire with one (1) silver dot to the wire that goes down to the turn signal. Daniel Stern recommends the Posi-Tap connector to make this connection. The advantage is that you don’t have to cut the turn signal wire, just tap into it. (https://www.allpar.com/reviews/other/posi-tap.html)
  6. I did not have any tapping hardware, so I cut the turn signal wires and used crimp connectors to connect the ground of the side marker bulb to the hot wire of the turn signal.
  7. Temporarily reconnect the turn signal wire to the bulb to test the connection. When the lights are off, the side marker should flash in sync with the turn signal. When the lights are on, the side marker should light up, and when the turn signals operate it should flash too, but in opposite phase. (See videos above)
  8. Disconnect the turn signal wire again to make more room to work, and use a good quality black electrical tape to seal the junctions
  9. Reconnect the turn signal wire.

TeamCity Agent Unmet Requirements

When a TeamCity configuration is created there are requirements the TeamCity Agent has to meet.

The creator of the build configuration can specify Explicit Requirements on the Agent Requirements page of the Build Configuration Settings.

When the build configuration is created, TeamCity automatically adds Build Step Requirements.

The bottom of the same page shows the list of compatible and incompatible agents.

If you visit the incompatible agent, most likely it will not contain the parameter, or the value will be different from the requirement. To see the expected value of the parameter, open the Agent ParametersConfiguration Parameters tab of an agent that satisfies the requirement.

Create a Splunk HTTP Event Collector token

To receive HTTP post messages in Splunk, we need to create a Splunk HTTP Collector token.

To create an index for this token see Create a Splunk index

  1. In the Settings menu select Data Inputs
  2. Select the HTTP Event Collector link
  3. Click the New Token button
  4. Enter a name and description for the token and click the Next button
  5. Select the index to store the events in, set it as the default index, and click the Review button
  6. Click the Submit button to create the token
  7. The confirmation screen shows the token. You will be able to see it again on the token list page. Click the Start Searching button to see the search statement to see the events collected by this token.
  8. You can always search for the events with
    source="http:MY_INPUT" (index="MY_INDEX")

  9. The HTTP Event Collector token list shows the token.

Create a Splunk index

Splunk stores the events in separate databases based on index names. It is faster to search for events if the event types are separated into multiple indexes.

To create an index for the event type you want to send to Splunk

  1. In the Settings menu select Indexes
  2. Click the New Index button
  3. Enter the name of the index. You can leave the default settings, and click the Save button.