Entity Framework DbContext: Value cannot be null, parameter name source

c#, c#-4.0, entity-framework, entity-framework-5

Solution

You should define properties instead of fields for sets in your context class. So, instead of fields

public DbSet<AProduct> AProducts;

You should use properties

public DbSet<AProduct> AProducts { get; set; }

Because Entity Framework looks for properties. If you will explore sources of `DbContext` class, you will see, that in constructor in searches for declared set properties and initializes them:

private void DiscoverAndInitializeSets()
{
    new DbSetDiscoveryService(this).InitializeSets();
}

This set discover service looks only for properties:

var flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
var properties = 
   from p in this._context.GetType().GetProperties(flags)
   where (p.GetIndexParameters().Length == 0) && 
         (p.DeclaringType != typeof(DbContext))
   select p);

foreach(PropertyInfo info in properties)
{
    // ...
}

If you will declare simple field of `DbSet<T>` type, EF will skip it's initialization, and field will have value `null` after context is created. Thats why where enumerator was throwing `null source` exception here:

productsDb.AProducts.Where(a => a.Id== id)

Problem

I've started out using the CodeFirst approach in the entity framework. When running my code I am unable to perform any operation on the DbSets within the DbContext - ProductsDb I have checked the connection string and I think it is correct but attempting to perform operation results in the error Value cannot be null, parameter source. Here is the ProductsDb class ``` public class ProductsDb : DbContext { public ProductsDb(string connectionString) : base(connectionString) { } public ProductsDb() { } public DbSet<AProduct> AProducts; public DbSet<BProduct> BProducts; public DbSet<CProduct> CProducts; public DbSet<DProduct> DProducts; } ``` The connection string is defined in the app.config as follows: ``` <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="ProductsDb" providerName="System.Data.SqlClient" connectionString="Data Source=MyPC\DEV;Initial Catalog=Test;User ID=sa; Password=pass;" /> </connectionStrings> </configuration> ``` The code that throws the error is: ``` GetAProduct(string id) { AProduct aProduct = null; using (ProductsDb productsDb = new ProductsDb()) { aProduct = (from a in productsDb.AProducts where a.Id== id select a).FirstOrDefault(); } return aProduct; } ``` All of the product classes are plain old C# classes. Any help would be really appreciated, I'm starting to pull my hair out. Never have any problems when writing Sql queries. UPDATE: Copy Paste error the GetAProduct method has been altered.

Original source