How do I map a C# int to a SqlServer tinyint using Entity Framework Code First?

Short answer : You can't.

The mappings "line up" like below.

The property on the POCO should be "byte".

    public byte CountryId{ get; set; }

and the Mapping:

        this.Property(t => t.CountryId).HasColumnName("CtryId");

You gotta play by the rules of EF.

However, the good news is that you can make it work with a little magic.

Since you don't want to break the contract..... you can do a workaround.

public byte JustForMappingCtryId{ get; set; }

[NotMapped]
public int CountryId
{ 
    get
    { 
        return Convert.ToInt32(this.JustForMappingCtryId);
    } 
    set
    {
        if(value > 8 || value < 0 )
        {
              throw new ArgumentOutOfRangeException("Must be 8 or less, and greater or equal to zero.");
        }
        //this.JustForMappingCtryId = value;  /* Uncomment this code.. to put back the setter... you'll have to do the conversion here (from the input int to the byte) of course..but the edited out code shows the intention */      
    }
}

and the mapping:

   this.Property(t => t.JustForMappingCtryId).HasColumnName("CtryId");

And put an entity framework "ignore" attribute on CountryId.

There ya go. It is a workaround, but should fit your need.