Wednesday, 3 October 2012

Tips and Hints: Entity Framework bits and pieces

This is a mix of all sorts of tiny bits I find while using Entity Framework. 

* Singularise tables' names.

Tables generated by EF will be named as plural automatically, in order to switch it to use singleton, the plural convention needs removing from model builder.
public class MyEntity : DbContext, IDisposable
{
public DbSet<Product> Product {get;set;}
public DbSet<Category> Category {get;set;}

public MyEntity(string nameOrConnectionString)
: base(nameOrConnectionString)
{ }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
}
}

* Create a One-To-Many relationship table using Code First, and access it via LINQ.

The following setups are used to configure a one-to-many relationship:
public class Product
{
 public int ProductID { get; set; }

 public int CategoryID { get; set; }
 public Category Category { get; set; }
}

public class Category
{
 public int CategoryID { get; set; }
}

public class MyEntity : DbContext, IDisposable
{
 public DbSet<Product> Product { get; set; }
 public DbSet<Category> Category { get; set; }

 public MyEntity(string nameOrConnectionString)
 : base(nameOrConnectionString)
 { }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
 modelBuilder.Entity<Product>().HasOptional(p => p.Category).WithMany().HasForeignKey(m => m.CategoryID);
        }
}

* Create a Many-To-Many relationship table using Code First, and access it via LINQ.

The following setups are required to configure two tables with many to many relationship: 
public class Product
{
public int ProductID {get;set;}
public ICollection<Category> Category {get;set;}
}

public class Category
{
public int CategoryID {get;set;}
public ICollection<Product> Product {get;set;}
}

public class MyEntity : DbContext, IDisposable
{
public DbSet<Product> Product {get;set;}
public DbSet<Category> Category {get;set;}

public MyEntity(string nameOrConnectionString)
: base(nameOrConnectionString)
{ }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasMany(p => p.Category)
  .WithMany(p => p.Product)
.Map(
m =>
{
m.MapLeftKey("ProductID");
m.MapRightKey("CategoryID");
m.ToTable("ProductCategory");
});
}
}
Three tables, namely "Product", "Category" and "ProductCategory", are created as the result of previous code. Among which, "ProductCategory" is the relationship table containing primary key from "Product" and "Category" tables as its union unique key.

Use the following code to query for the joined result.
var productCategory = this.myEntity.Product
                .Include("Category")
                .Where(p => p.ProductID == productID)
                .ToString();

Sunday, 30 September 2012

Error: Handler “PageHandlerFactory-Integrated” has a bad module “ManagedPipelineHandler” in its module list in IIS 7.5

The shocking screen of death appeared on Friday when I created a new web project on my new PC, which says 'Handler “PageHandlerFactory-Integrated” has a bad module “ManagedPipelineHandler” in its module list'. 
IIS 7.5 Detailed Error - 500.21 - Internal Server Error
Server Error in Application "DEFAULT WEB SITE"
Internet Information Services 7.5

[Error Summary]
HTTP Error 500.21 - Internal Server Error
Handler "PageHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list

[Detailed Error Information]
Module IIS Web Core
Notification ExecuteRequestHandler
Handler PageHandlerFactory-Integrated
Error Code 0x8007000d
Requested URL http://localhost:80/default.aspx
Physical Path C:\inetpub\wwwroot\default.aspx
Logon Method Anonymous
Logon User Anonymous

[Most likely causes:]
•Managed handler is used; however, ASP.NET is not installed or is not installed completely.
•There is a typographical error in the configuration for the handler module list.

[Things you can try:]
•Install ASP.NET if you are using managed handler.
•Ensure that the handler module's name is specified correctly. Module names are case-sensitive and use the format modules="StaticFileModule, DefaultDocumentModule, DirectoryListingModule".

[Links and More Information]
IIS core does not recognize the module.
View more information »
By looking into the "Things you can try" and a bit of quick search, I realised it was my dodgy IIS that is causing the problem, which is essentially .NET is not registered with IIS. So I carry out the solution provided in "WIshMesh", and problem's solved!
Running the following commands solved this issue:

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i