title: EF 4.1 Code First - change to FK value not updated when using new context/over WCF
body: <p>I'm using EF Code First over WCF.  So when I save an entity it's using a new context.</p>
  
  <p>If I retrieve an entity, then update it so it references a different entity, I'm finding that it saves with the original foreign key value.</p>
  
  <p>For example, I retrieve a Company class, where the country is UK.  I then change it to USA and pass it back to the service.  When I check the table the FK is still set to that of UK.</p>
  
  <p>How can I make it update the foreign key?</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Data.Entity.ModelConfiguration;
  using System.ComponentModel.DataAnnotations;
  using System.Data.Entity;
  using System.Data;
  
  namespace CodeFirstExistingDatabase
  {
  
      class Program
      {
          private const string ConnectionString = @"Server=.\sql2005;Database=CodeFirst2;integrated security=SSPI;";
  
          static void Main(string[] args)
          {
  
              // Firstly, create a new country record.
              Country country = new Country();
              country.Code = "UK";
              country.Name = "United Kingdom";
  
              // Create aother new country record.
              Country country2 = new Country();
              country2.Code = "USA";
              country2.Name = "US of A";
  
              // Now create an instance of the context.
              MyContext myContext = new MyContext(ConnectionString);
              myContext.Entry(country).State = EntityState.Added;
              myContext.Entry(country2).State = EntityState.Added;
              myContext.SaveChanges();
              Console.WriteLine("Saved Countries");
  
              // Now insert a Company record
              Company company = new Company();
              company.CompanyName = "AccessUK";
              company.HomeCountry = myContext.Countries.First(e =&gt; e.Code == "UK");
              myContext.Companies.Add(company);
              myContext.SaveChanges();
              Console.WriteLine("Saved Company");
  
              Company savedCompany = myContext.Companies.First(e =&gt; e.CompanyName == "AccessUK");
              Country usCountry = myContext.Countries.First(e =&gt; e.Code == "USA");
              savedCompany.HomeCountry = usCountry;
  
              // Create another context for the save (as if we're passing the entity back over WCF and thus
              // creating a new context in the service)
              MyContext myContext2 = new MyContext(ConnectionString);
              myContext2.Entry(savedCompany).State = EntityState.Modified;
              myContext2.Entry(savedCompany.HomeCountry).State = EntityState.Modified;
              myContext2.SaveChanges();
  
              // When I check the company table, it has the foreign key of the UK Country.  It should have 
              // that of USA.
  
              Console.WriteLine("Finished");
              Console.ReadLine();
  
          }
      }
  
          public class MyContext
              : DbContext
          {
              public DbSet&lt;Company&gt; Companies { get; set; }
              public DbSet&lt;Country&gt; Countries { get; set; }
  
              public MyContext(string connectionString)
                  : base(connectionString)
              {
              }
              protected override void OnModelCreating(DbModelBuilder modelBuilder)
              {
                  modelBuilder.Configurations.Add(new CountryConfiguration());
                  modelBuilder.Configurations.Add(new CompanyConfiguration());
  
                  base.OnModelCreating(modelBuilder);
              }
          }
  
      public class CompanyConfiguration
          : EntityTypeConfiguration&lt;Company&gt;
      {
  
          public CompanyConfiguration()
              : base()
          {
  
              HasKey(p =&gt; p.Id);
              Property(p =&gt; p.Id)
                  .HasColumnName("Id")
                  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                  .IsRequired();
  
              Property(p =&gt; p.CompanyName)
                  .HasColumnName("Name")
                  .IsRequired();
              HasRequired(x =&gt; x.HomeCountry).WithMany()
                  .Map(x =&gt; x.MapKey("HomeCountryId"));
  
              ToTable("Companies");
          }
  
      }
  
      public class CountryConfiguration
          : EntityTypeConfiguration&lt;Country&gt;
      {
  
          /// &lt;summary&gt;
          /// Initializes a new instance of the &lt;see cref="CountryConfiguration"/&gt; class.
          /// &lt;/summary&gt;
          public CountryConfiguration()
              : base()
          {
  
              HasKey(p =&gt; p.Id);
              Property(p =&gt; p.Id)
                  .HasColumnName("Id")
                  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                  .IsRequired();
              Property(p =&gt; p.Code)
                  .HasColumnName("Code")
                  .IsRequired();
              Property(p =&gt; p.Name)
                  .HasColumnName("Name")
                  .IsRequired();
  
              ToTable("Countries");
          }
  
      }
  
      public class Company
      {
          public int Id { get; set; }
          public string CompanyName { get; set; }
          public Country HomeCountry { get; set; }
      }
  
      public class Country
      {
          public int Id { get; set; }
          public string Code { get; set; }
          public string Name { get; set; }
      }
  }
  </code></pre>
  
  <p>Many thanks,</p>
  
  <p>Paul.</p>